如何在Golang中掌握数据类型_Golang整型字符串与布尔类型操作

12次阅读

go整型字符串不能用String(n),应使用strconv.Itoa或strconv.Formatint;字符串转整型需用strconv.ParseInt并指定精度;布尔值转换必须用strconv.Formatbool和ParseBool;跨类型比较需显式类型转换

如何在Golang中掌握数据类型_Golang整型字符串与布尔类型操作

Go 里整型转字符串不能直接用 string(n)

这是新手最常踩的坑:把 int 直接套 string(),结果得到的是 ASCII 码对应的字符,比如 string(65) 得到 "A",而不是 "65"。真正转数字字符串得用标准库

import "strconv"  n := 42 s := strconv.Itoa(n)           // 最快,仅支持 int s2 := strconv.FormatInt(42, 10) // 支持 int64,10 表示十进制 s3 := fmt.Sprintf("%d", n)     // 灵活但有格式开销

注意 strconv.Itoa 只接受 int,如果变量是 int32int64,必须先显式转换,否则编译报错。

字符串转整型要处理错误,strconv.Atoi 不是万能的

strconv.Atoi 看起来方便,但它只处理 int 类型且底层调用 ParseInt(s, 10, 0),而 0 表示“用当前平台的 int 位宽”,这在 32 位和 64 位环境行为不一致。更稳妥的做法是明确位宽:

n, err := strconv.ParseInt("123", 10, 64) // 明确要 int64 if err != nil {     log.Fatal(err) } // 再按需转成 int32/int 等

常见错误现象包括:传入空字符串、含空格、带前导 +/− 以外符号(如 "12a3")、超出目标类型的表示范围(如 "99999999999999999999"int32)。这些都会让 err != nil,忽略它会导致 panic 或静默截断。

布尔值和字符串互转没有隐式转换strconv 是唯一可靠路径

Go 不允许 boolstring 自动转换,也不能用类型断言或 string(b)。所有转换必须走 strconv

b := true s := strconv.FormatBool(b) // "true"  s2 := "false" b2, err := strconv.ParseBool(s2) // b2 == false, err == nil // 支持的字符串值只有:"true", "false", "1", "0", "t", "f"

注意 ParseBool 对大小写不敏感,但只认这几种字面量;传入 "yes""on" 或空字符串会返回 err != nil。别试图用 fmt.Sprintf("%t", b) 做输出——它虽可行,但不如 FormatBool 语义清晰、性能略优。

类型混用时注意零值和比较陷阱

Go 的强类型系统会让跨类型比较直接编译失败,比如 int32(42) == 42 报错。但更隐蔽的问题出在结构体字段或 map value 中:

type Config struct {     Timeout int32 } cfg := Config{Timeout: 30} // 下面这行编译失败: // if cfg.Timeout == 30 { ... } // 必须写成: if cfg.Timeout == int32(30) { ... }

布尔字段同理:if user.Active == "true" 是非法的,必须先转布尔再比,或者用字符串字面量比(但语义已不同)。整型和字符串混存于 map[string]Interface{} 时,取出来务必做类型断言 + 检查,否则运行时 panic。

text=ZqhQzanResources