strconv.Atoi仅支持十进制int转换且无法指定进制和位宽,而strconv.ParseInt可自定义进制(如0自动识别0x前缀)和位宽(8/16/32/64),返回int64和error,更安全可控。

strconv.Atoi 和 strconv.ParseInt 的区别在哪
直接用 strconv.Atoi 转字符串为整数最简单,但它只支持 int 类型(底层是 int64 或 int32,取决于平台),且无法指定进制或位宽。一旦字符串含非数字字符、空、或超出 int 范围,就 panic 或返回错误。
strconv.ParseInt 更可控:能指定进制(如 2、8、10、16)和位宽(8、16、32、64),返回 int64 和 error,适合需要明确类型或容错的场景。
-
strconv.Atoi("123")→123, nil;strconv.Atoi("0x1F")→0, error(不识别 0x 前缀) -
strconv.ParseInt("0x1F", 0, 64)→31, nil(base=0自动识别前缀) -
strconv.ParseInt("255", 10, 8)→255, nil;但"256"就会报strconv.ParseInt: value out of range
float 字符串转数字该选 ParseFloat 还是 Atof
strconv.Atof 是历史遗留函数,已废弃,文档明确建议用 strconv.ParseFloat。它接受字符串和精度参数(32 或 64),返回 float32 或 float64 及错误。
注意:即使传 32,输入字符串若含超长小数位(如 "3.14159265358979323846"),解析仍可能因舍入产生误差;Go 不做“四舍五入截断”,而是按 IEEE 754 规则转换。
立即学习“go语言免费学习笔记(深入)”;
-
strconv.ParseFloat("3.14", 64)→3.14, nil -
strconv.ParseFloat("inf", 32)→+Inf, nil(支持 inf、-inf、nan) -
strconv.ParseFloat("1e1000", 64)→+Inf, nil(溢出转为无穷)
数字转字符串:Itoa、FormatInt、FormatFloat 怎么选
strconv.Itoa 最常用,等价于 strconv.FormatInt(int64(i), 10),专用于 int → 十进制字符串,简洁无配置。
需要控制格式时用更底层的函数:
-
strconv.FormatInt(int64(x), 16)→ 小写十六进制(如"ff") -
strconv.FormatUint(uint64(x), 2)→ 二进制(如"11111111") -
strconv.FormatFloat(3.14159, 'f', 2, 64)→"3.14"('f'表示定点格式,2是小数位数) -
strconv.FormatFloat(123.456, 'e', -1, 64)→"1.23456e+02"(-1表示自动选择最短表示)
常见错误:空字符串、空白字符、科学计数法处理不当
所有 Parse* 函数对空字符串("")、仅空白(" \t\n")都返回错误,不会自动 trim。科学计数法如 "1.23e+4" 可被 ParseFloat 正确识别,但 ParseInt 完全不支持 —— 它只认整数字符串。
容易忽略的点:
- 没检查 error 就直接用返回值,导致 panic 或逻辑错误
- 用
ParseInt(s, 10, 32)解析"2147483648"(超 int32 最大值)却没捕获 overflow 错误 - 把带逗号的数字字符串(如
"1,234")直接丢给ParseInt,结果失败 —— Go 不支持千分位 - 误以为
Itoa能处理int64,其实它只接受int;大整数需先转int64再用FormatInt
numStr := " 42 "
if n, err := strconv.ParseInt(strings.TrimSpace(numStr), 10, 64); err != nil {
log.Fatal(err)
} else {
fmt.Println(n) // 42
}
字符串开头或结尾有空格、数字范围边界、进制混淆、未处理 error —— 这些地方最容易掉坑里。










