Golang Scan值类型转换技巧
在Golang中,使用Scan函数进行输入时,如何处理不同类型之间的值转换?比如从字符串扫描到整数或浮点数时,有没有简洁高效的转换技巧?常见的方法有哪些,各自有什么优缺点?
2 回复
在Golang中,使用fmt.Scan系列函数读取输入时,所有输入默认都是字符串类型。以下是一些常用的值类型转换技巧:
1. 基础类型转换
package main
import "fmt"
func main() {
var input string
// 读取字符串
fmt.Print("请输入数字: ")
fmt.Scan(&input)
// 转换为整数
num, err := strconv.Atoi(input)
if err != nil {
fmt.Println("转换错误:", err)
return
}
fmt.Printf("整数: %d\n", num)
// 转换为浮点数
f, err := strconv.ParseFloat(input, 64)
if err == nil {
fmt.Printf("浮点数: %.2f\n", f)
}
}
2. 直接扫描到指定类型
package main
import "fmt"
func main() {
var num int
var price float64
var name string
fmt.Print("请输入整数、价格和姓名: ")
// 自动类型转换
_, err := fmt.Scan(&num, &price, &name)
if err != nil {
fmt.Println("输入错误:", err)
return
}
fmt.Printf("整数: %d, 价格: %.2f, 姓名: %s\n", num, price, name)
}
3. 使用bufio.Scanner进行高级处理
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("请输入多个数字(空格分隔): ")
if scanner.Scan() {
input := scanner.Text()
parts := strings.Fields(input)
for i, part := range parts {
if num, err := strconv.Atoi(part); err == nil {
fmt.Printf("第%d个数字: %d\n", i+1, num)
}
}
}
}
4. 错误处理技巧
func safeScanInt() int {
var input string
for {
fmt.Print("请输入整数: ")
fmt.Scan(&input)
if num, err := strconv.Atoi(input); err == nil {
return num
}
fmt.Println("输入无效,请重新输入")
}
}
主要转换函数
strconv.Atoi()- 字符串转整数strconv.ParseInt()- 字符串转指定进制整数strconv.ParseFloat()- 字符串转浮点数strconv.ParseBool()- 字符串转布尔值
记住始终处理转换错误,确保程序的健壮性。


