ParseInt 的 bitSize 是数值安全阀,必须设对才能防止溢出:设 32 则只接受 [-2147483648, 2147483647],超限即报 ErrRange;外部输入应统一用 ParseInt(s, 10, 64) 并前置清洗空格、逗号等非法字符。

直接用 strconv.ParseInt 并设对 bitSize,就能守住溢出边界——它不是“转换失败才报错”,而是“一超出目标类型范围就立刻拒绝”,这才是无损解析的前提。
为什么 ParseInt 的 bitSize 不是返回类型,却必须设对
strconv.ParseInt 永远返回 int64,但它的 bitSize 参数是数值安全阀:它强制检查解析结果是否落在对应整数类型的数学范围内。设成 32 就只接受 [-2147483648, 2147483647],超一点就返回 *strconv.NumError,Err 字段为 ERANGE。
常见误用:
- 传
32却想存 2147483648 → 立刻报value out of range - 传
0(等价于系统 int)→ 在 32 位环境可能意外截断大数 - 忽略前导空格 →
" 123"直接报invalid syntax,不是溢出问题,但常被误判
外部输入场景下 bitSize=64 是默认安全选择
HTTP 参数、数据库 ID、日志时间戳这类外部数据,往往以字符串形式传来,且值域明确在 int64 范围内(比如 9223372036854775807)。此时应固定用 bitSize = 64,而不是依赖 Atoi 或 bitSize = 0。
立即学习“go语言免费学习笔记(深入)”;
这样做能避免三类风险:
-
Atoi在 32 位系统上实际是int32,大数直接溢出 -
bitSize = 0行为随编译目标变化,CI 和生产环境不一致 - 不显式指定进制(
base)时,"0123"会被当八进制解析成 83,造成语义错误
正确写法:strconv.ParseInt(s, 10, 64) —— 明确十进制、明确 64 位范围、不依赖前缀推断。
如何区分 invalid syntax 和 value out of range
两种错误都来自 *strconv.NumError,但处理逻辑完全不同:
-
e.Err == strconv.ErrSyntax:输入格式非法,比如"12a3"、""、"--12",属于客户端数据污染,应拒收并提示 -
e.Err == strconv.ErrRange:格式合法但数值越界,比如"9223372036854775808"(比int64最大值大 1),说明上游传了超规格数据,需告警而非静默截断
别用 err.Error() 字符串匹配判断——它不稳定。始终用 errors.Is(err, strconv.ErrRange) 或直接比较 e.Err 字段。
ParseInt 无法处理的边界情况,得靠前置清洗
ParseInt 不做任何隐式转换,也不容忍模糊输入。以下情况它一律报错,必须由你提前处理:
- 带空格:
" 42 "→ 先用strings.TrimSpace - 带逗号分隔符:
"1,234"→ 用strings.ReplaceAll(s, ",", "") - 科学计数法整数:
"1e6"→ParseInt不支持,得先用ParseFloat再转,但要注意精度丢失风险 - Unicode 数字字符:
"123"(全角)→ParseInt不识别,需用unicode包标准化
真正关键的不是“怎么转”,而是“谁该负责清理”。外部输入永远不能假设干净,ParseInt 的职责只是校验和转换,不是容错处理器。


















