strconv.atoi不会panic,但忽略error返回值导致空指针解引用;应优先用strconv.parseint/parsefloat并检查错误,配合trimspace处理空白,避免atof(已弃用)和string()误转ascii。

strconv.Atoi 转数字失败时 panic?别用它直接处理用户输入
它不处理错误,只返回 int 和 error,但很多人忽略第二个返回值,导致 panic: runtime error: invalid memory address 实际是空指针解引用——因为没检查 err != nil 就用了 num。
真实场景里,用户输入、配置文件读取、HTTP 查询参数都是字符串,必须容错。用 strconv.ParseInt 更可控,能指定进制和位宽。
-
strconv.Atoi("123")等价于strconv.ParseInt("123", 10, 0),但前者无法指定int64或int32 - 遇到
"12.5"、"0x1F"、" 42 "(带空格)都会报strconv.Atoi: parsing "12.5": invalid syntax - 想支持十六进制?必须用
strconv.ParseInt("1F", 16, 64),Atoi固死十进制
字符串转浮点数:ParseFloat 比 Atof 更安全,但精度陷阱得自己兜底
strconv.ParseFloat 是唯一正经选择;strconv.Atof 已被弃用,Go 1.22+ 编译直接报错 undefined: strconv.Atof。
它返回 float64 和 error,但要注意:Go 的 float64 无法精确表示大多数十进制小数,比如 "0.1" + "0.2" 转成数字再相加,结果不是 0.3 而是 0.30000000000000004。
- 金融计算别用
ParseFloat,改用shopspring/decimal库解析字符串为定点数 - 需要保留原始小数位数?先用
strings.TrimSpace清空两端空格,再传给ParseFloat,否则" 3.14 "会报错 - 想限制小数位?
ParseFloat不管这事,得自己正则匹配或用fmt.Sscanf
数字转字符串:fmt.Sprintf 不一定慢,但 string() 不能乱用
string(65) 得到的是 "A"(ASCII 字符),不是 "65" —— 这是最常见的误用,尤其从 Python 切过来的人容易踩。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
真正要转数字字面量,有三个主流方式:
-
strconv.Itoa(42):最快,仅限int,底层无格式化开销 -
strconv.FormatInt(int64(42), 10):支持int64和任意进制,比如FormatInt(255, 16)→"ff" -
fmt.Sprintf("%d", 42):通用、易读,但有反射和格式解析开销,QPS 上万时可观测到差异
注意:fmt.Sprint(42) 也能转,但比 Sprintf 多一次接口转换,性能略差;别图省事写成 "" + strconv.Itoa(x),空字符串拼接无意义。
Unicode 字符串含中文时,数字转换逻辑不变,但长度和切片要小心
Go 字符串是 UTF-8 字节序列,len("你好123") 是 9(3 个汉字 × 3 字节 + 3 个 ASCII),但 len([]rune("你好123")) 是 6。这不影响 strconv 函数——它们只认 ASCII 数字字节,遇到 "一二三" 直接报错 parsing "一二三": invalid syntax。
所以,如果原始字符串混排中英文数字(如 "订单号:B20240517001"),别想着靠 strconv 提取数字部分——它不会自动跳过非数字字符。
- 提取连续数字?用正则
regexp.MustCompile(\d+).FindString() - 逐字符判断?用
unicode.IsDigit(rune),不是byte >= '0' && byte (后者对中文数字失效) - 把整个字符串当数字转?先
strings.Map过滤掉非数字字符,但注意负号、小数点是否要保留
最常被漏掉的其实是编码边界:从 HTTP body 或文件读出的字符串,如果含 BOM 或换行符,strconv 会因首尾空白直接失败,strings.TrimSpace 应该成为转换前的默认动作。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










