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

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,如果变量是 int32 或 int64,必须先显式转换,否则编译报错。
字符串转整型要处理错误,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 不允许 bool 和 string 自动转换,也不能用类型断言或 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。










