应优先使用strconv.atoi处理明确为十进制、范围可控且无需指定精度的简单场景;需控制进制、位宽或处理前缀时,必须用strconv.parseint。

用 strconv.Atoi 和 strconv.ParseInt 处理整数转换
直接调用 strconv.Atoi 最快,但它只支持十进制 int(即 int 类型,具体取决于平台是 int32 还是 int64),且无法指定位宽或进制。一旦字符串含空格、前导 +、非数字字符(包括 Unicode 数字),就会报 strconv.Atoi: parsing "..." 错误。
更安全的做法是用 strconv.ParseInt:它明确要求传入进制(如 10)和位宽(如 64),返回 int64 和 error;还能处理带 +/- 符号的字符串,但会拒绝含空白或不可见控制符的输入。
- 别依赖
strconv.Atoi做健壮解析——它不校验前导/尾随空白," 123"会失败 - 需要
int32?必须用strconv.ParseInt(s, 10, 32),再显式转成int32,否则可能溢出 -
ParseInt对"123abc"返回错误,不是截断;若需容忍后缀,得先正则提取数字部分
用 strconv.ParseFloat 解析浮点数时注意精度和上下文
strconv.ParseFloat 是唯一标准库中支持浮点解析的函数,它接受字符串和精度(32 或 64),返回 float64(即使精度设为 32,也先按 float64 解析再舍入)。它能识别 e/E 科学计数法、小数点、正负号,但不接受逗号分隔符或全角数字。
-
"1.23e-4"合法,"1,234.56"非法——Go 不做本地化格式解析 - 精度参数影响舍入行为:
ParseFloat("1.23456789", 32)返回的float32可能和直接float32(1.23456789)有细微差异 - 遇到
"inf"、"nan"(忽略大小写)会成功解析,但后续计算可能意外失效;业务上通常应拒绝这些值
空格、Unicode 和边界值必须手动清洗
Go 的 strconv 系列函数**不做任何字符串预处理**:前导/尾随空格、\u00A0(不间断空格)、\u200B(零宽空格)都会导致解析失败。也不会把全角数字(如 "123")转为 ASCII 数字。
- 简单去空格?用
strings.TrimSpace(s),但注意它不处理 Unicode 空格;更稳妥用strings.Map+unicode.IsSpace清洗 - 要支持全角数字?得先用
unicode.IsDigit扫描并映射到 ASCII,或引入第三方库(如golang.org/x/text/unicode/norm)标准化 - 边界值如
"0"、"-0"、"+0"都能正确解析,但"-0x10"在十进制模式下会失败——进制必须匹配
错误处理不能只检查 err != nil
很多代码只写 if err != nil { return 0, err },但没区分错误类型。比如 ParseInt 可能返回 strconv.ErrRange(超出目标类型的表示范围)或 strconv.ErrSyntax(格式不对),这两类错误的修复策略完全不同。
- 用
errors.Is(err, strconv.ErrRange)判断是否溢出,可据此返回默认值或向上抛错 -
strconv.ErrSyntax表示输入非法,适合记录原始字符串用于排查 - 不要忽略
err直接用零值 fallback——ParseInt("", 10, 64)返回0, ErrSyntax,此时0并非有效结果
真正安全的转换不是选对函数,而是明确每一步的假设:输入来源是否可信、是否允许空白、是否需国际化支持、溢出时业务怎么兜底。标准库只做严格解析,其余都得自己补。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











