strconv.Atoi 转换失败时返回 0 和非 nil error;必须检查 err != nil,不能仅凭返回值是否为 0 判断成功。

strconv.Atoi 转换失败时返回什么
它不 panic,而是返回 0 和一个非 nil 的 error。很多人只取第一个返回值,误把 0 当成合法结果,导致逻辑错误。
- 必须显式检查
err != nil,不能只看返回数字是否为 0 -
strconv.Atoi("abc")返回0, strconv.ParseInt: parsing "abc": invalid syntax - 对空字符串、带空格、含字母的输入都失败,不是仅限于非数字字符开头
- 如果业务允许默认值,建议用
strconv.ParseInt(s, 10, 64)自定义 base 和 bitSize,再做错误处理
ParseInt 和 ParseUint 的 bitSize 参数怎么选
bitSize 控制目标整数类型大小,不是“精度”,选错会导致溢出或截断,且不报错——只默默返回错误或截断值。
- 想转成
int:注意int在 32 位系统是 32 位,在 64 位系统是 64 位;稳妥起见统一用64 - 想存进数据库 int32 字段?用
ParseInt(s, 10, 32),但要接住strconv.ErrRange -
ParseUint("−5", 10, 64)直接返回0, strconv.ParseUint: parsing "−5": invalid syntax—— 它不接受负号 - 别用
ParseUint处理可能为负的输入,否则会静默失败
float64 转字符串时小数位丢失怎么办
strconv.FormatFloat 默认只保留必要小数位,不是四舍五入问题,是格式化策略导致的“看起来丢精度”。
-
strconv.FormatFloat(1.200, 'f', -1, 64)输出"1.2",不是 bug,是-1表示“最短表示” - 要固定两位小数,写成
strconv.FormatFloat(x, 'f', 2, 64),输出"1.20" - 科学计数法用
'e'或'E',比如strconv.FormatFloat(123456789, 'e', 3, 64)→"1.235e+08" - 注意浮点数本身存储就有精度限制,
FormatFloat只负责按规则转字符串,不修复底层 float64 误差
字符串转布尔值要注意哪些边界情况
strconv.ParseBool 只认四个字符串:"true"、"false"、"1"、"0",其余全报错,大小写敏感。
立即学习“go语言免费学习笔记(深入)”;
-
ParseBool("True")或ParseBool("TRUE")都返回 error -
ParseBool("on")、ParseBool("yes")、ParseBool("")全部失败 - 如果上游协议允许这些变体,得自己写映射表,别指望
ParseBool扩展 - 常见坑:前端传
"false"字符串,后端用json.Unmarshal解析结构体字段为 bool 是 OK 的,但手动调ParseBool就必须严格匹配
Parse* 函数在输入非法时都返回零值 + error,而 Go 的多返回值机制让开发者很容易只拿第一个值,漏掉错误检查。










