Go字符串转数字首选strconv包,因Atoi仅支持十进制int且不灵活,应按需选用ParseInt/ParseUint/ParseFloat并严格处理错误、空格、进制及精度问题。

直接用 strconv 包,别绕路——它就是 Go 里唯一靠谱、无依赖、错误可追溯的字符串与数字互转方案。
字符串转整数该选 Atoi 还是 ParseInt
外部输入(如 HTTP 参数、配置项)优先用 strconv.Atoi:它简洁、明确、错误信息清晰,且不 panic。但它的能力有限:
-
Atoi只支持十进制,"0xFF"、"1010"(二进制)会直接报invalid syntax - 它返回
int,在 32 位系统上是int32,64 位上是int64,无法指定目标类型宽度 - 带前导空格如
" 42"会失败,得先strings.TrimSpace
需要控制进制或精度时,必须换 ParseInt(s, base, bitSize):
-
ParseInt("1010", 2, 64)→10(二进制转int64) -
ParseInt("FF", 16, 32)→255(十六进制转int32) - 溢出时返回
*strconv.NumError,Err字段为ERANGE,比Atoi更早暴露数据问题
ParseFloat 的 bitSize 参数不是小数位数
这是最常踩的坑:bitSize 决定返回值是 float32 还是 float64,和“保留几位小数”完全无关。
在 Go 中使用 google/wire 实现编译时依赖注入——wire.NewSet、wire.Build、wire.Bind(接口→实现)、wire.Struct、wire.Value、wire.Interface
立即学习“go语言免费学习笔记(深入)”;
-
ParseFloat("1.23456789", 32)先解析成float32,再转float64,末位可能丢失 -
ParseFloat("1.23456789", 64)才是完整精度解析,业务中推荐统一用64 - 传
2或4不会编译失败,但会静默转成float64(2)或float64(4),数值完全错乱 - 非法格式如
"1.23e"在 Go 1.22+ 中明确报错,旧版本可能截断,升级后要检查日志
数字转字符串别只记 Itoa,进制和格式得看 Format*
strconv.Itoa(i) 是 FormatInt(int64(i), 10) 的快捷写法,够用但不够灵活。
- 要十六进制:
FormatInt(255, 16)→"ff"(小写),大写需额外strings.ToUpper - 要二进制:
FormatUint(10, 2)→"1010"(注意无符号数用FormatUint) - 浮点数格式控制靠
FormatFloat(f, fmt, prec, bitSize):FormatFloat(3.14159, 'f', 2, 64)→"3.14";'g'自动选f或e;prec = -1表示尽可能短 - 高频拼接场景(如日志、序列化),避免反复调
Itoa,改用AppendInt(dst []byte, i, 10)复用缓冲区
错误处理不能只写 if err != nil
strconv 所有解析函数都返回 *strconv.NumError,它包含三个关键字段:
-
Func:告诉你出错的是ParseInt还是ParseFloat,便于路由不同修复逻辑 -
Num:原始输入字符串,可用于构造用户提示,比如fmt.Sprintf("无法解析数字:%q", e.Num) -
Err:底层错误,invalid syntax(格式错)或value out of range(溢出)要分开响应 - 别用
fmt.Sscanf替代——它对"123abc"都能成功赋值123,掩盖非法输入
真正难的不是写对那行 num, err := strconv.Atoi(s),而是想清楚这个 s 从哪来、有没有被 trim 过、是否允许科学计数法、下游是否容忍 0 默认值——这些决定了你该用哪个函数、怎么 check error、要不要提前 normalize。

















