strconv.Atoi转换失败时返回0和一个非nil错误,0仅为零值占位符,必须检查错误才能判断是否成功;空字符串、含字母或前后空格的字符串均会失败。

strconv.Atoi 转换失败时返回什么
strconv.Atoi 在输入字符串无法解析为整数时,会返回 0 和一个非 nil 的错误。注意:返回的 0 不代表“转换成功得到 0”,它只是零值占位符,必须检查错误才能判断是否真成功。
常见误用是只取第一个返回值:
num := strconv.Atoi("abc") // 错!忽略错误,num 是 0,但实际失败了
正确写法必须显式检查错误:
num, err := strconv.Atoi("123")
if err != nil {
log.Fatal(err)
}
// 此时 num 才可信
- 空字符串
""、带空格的字符串如" 42"、含字母的字符串如"12a3"都会失败 - 前导/尾随空格不被自动忽略 —— 想支持空格要用
strings.TrimSpace预处理 - 它等价于
strconv.ParseInt(s, 10, 0),即 base=10、bitSize=0(平台默认,通常是 64)
ParseInt 和 ParseUint 的 bitSize 参数怎么选
strconv.ParseInt 和 strconv.ParseUint 要求指定目标整数位宽(bitSize),比如 8、16、32、64。选错会导致溢出错误,哪怕数值本身在 int64 范围内。
例如:
_, err := strconv.ParseInt("300", 10, 8) // err != nil:300 > 127
关键点:
- 不是“我当前变量类型是
int32就填32”,而是“我要把字符串转成一个能存进int32变量的值”,所以必须确保字符串数值落在int32范围内(−2147483648 到 2147483647) - 如果不确定范围或想兼容大数,直接用
64最安全;之后再手动转成更小类型(并自行检查溢出) -
ParseUint不接受负号,传入"-5"会报strconv.ParseUint: parsing "-5": invalid syntax
float 字符串转数字该用 ParseFloat 还是 Atof
优先用 strconv.ParseFloat,而不是 strconv.Atof(后者已弃用,Go 1.19+ 编译会警告)。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
ParseFloat(s, bitSize) 的 bitSize 只能是 32 或 64,对应 float32 和 float64。它比 Atof 多一个可控参数,且行为明确:
-
strconv.ParseFloat("1.23e-4", 64)→1.23e-4(float64) - 科学计数法、小数点、正负号都支持,但
"inf"、"nan"默认不识别(需额外设置strconv.ParseFloat("inf", 64)会失败) - 精度丢失风险始终存在:比如
"0.1"转float64后不是精确的 0.1,这是浮点数底层限制,和strconv无关
字符串转布尔为什么不能用 strconv.ParseBool 处理 "1" 或 "0"
strconv.ParseBool 只认四个字符串:"true"、"false"、"1"、"0" —— 等等,它其实**能**处理 "1" 和 "0"。
但问题常出在大小写和空格上:
strconv.ParseBool("True") // error: invalid syntax
strconv.ParseBool(" 1 ") // error: invalid syntax(前后空格不被容忍)
所以真实使用中要注意:
- 它不进行 trim,也不忽略大小写 —— 必须严格匹配那四种形式
- 如果你的输入来自表单或配置文件,可能含空格或大小写混用,得先
strings.TrimSpace+strings.ToLower - 别指望它识别
"yes"、"on"、"enabled"—— 这些需要自己映射
边界情况多,建议封装一层健壮的解析函数,而不是裸调 ParseBool。

















