strconv.atoi 不会 panic,只返回 (int, error),需显式检查 err;参数仅支持 int 类型,空格和前导 + 允许,但制表符不行;性能优于 parseint,但不支持 locale。

strconv.Atoi 会 panic 吗?不会,但返回 error
strconv.Atoi 从不 panic,它总是返回 (int, error)。很多人误以为传入非法字符串会崩溃,其实只是 error 非 nil —— 必须显式检查。常见错误是直接赋值忽略 error:
num := strconv.Atoi("123abc") // 编译通过,但 num=0, err!=nil
正确写法必须 unpack:
- 用
num, err := strconv.Atoi(s)解构返回值 - 检查
err != nil,不能只看num是否为 0(因为 "0" 合法,也返回 0) - 错误类型通常是
*strconv.NumError,可类型断言获取详细信息(如err.(*strconv.NumError).Func是 "Atoi")
strconv.Itoa 的输入限制:只接受 int,不是 int64 或 uint
strconv.Itoa 参数类型是 int,不是任意整数类型。传 int64、uint、int32 会编译报错:
strconv.Itoa(int64(42)) // ❌ cannot use int64(42) as int value
解决方法只有显式转换:
- 确认值在
int范围内(通常 32 或 64 位,取决于平台),再用int(x) - 若不确定范围或类型固定(如数据库返回
int64),改用strconv.FormatInt(x, 10) -
strconv.FormatUint对应uint64,别混用
数字字符串转 int 时,空格和前导 + 是允许的,但制表符不行
strconv.Atoi 实际调用的是 strconv.ParseInt(s, 10, 0),它对输入有隐式 trim 规则:
- 允许首尾空白(
" -42 "→ -42) - 允许前导
+("+123"→ 123) - 但
\t、\n等 Unicode 空白符不被识别为“空白”,会报invalid syntax - 十六进制需显式用
strconv.ParseInt(s, 16, 64),Atoi只认十进制
如果输入来源不可控(如 HTTP query 参数),建议先 strings.TrimSpace 再转,避免因不可见字符失败。
性能敏感场景下,Atoi 比 ParseInt 快,但 Itoa 没有更快替代
strconv.Atoi 是 ParseInt(s, 10, 0) 的特化版本,省去 base/size 参数校验,实测快 10–15%;而 strconv.Itoa 就是 FormatInt(int64(i), 10) 的封装,没有额外开销,也不提供更底层接口。
- 高频数字转换(如日志解析)优先用
Atoi而非通用ParseInt - 不要为“优化”把
Itoa换成fmt.Sprintf("%d", x)—— 后者慢 3–5 倍且分配更多内存 - 如果已知数字恒为正且位数固定(如 6 位订单号),可预分配字符串并手写填充,但绝大多数场景没必要
真正容易被忽略的是:所有 strconv 数字转换函数都不支持 locale(比如千分位逗号),遇到 "1,234" 会直接失败 —— 这类需求得靠正则清洗或第三方库。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











