跳转到主内容
极星编程网:以代码为星,赴技术山海!

Golang strconv标准库怎么做类型转换_Golang数据转换说明

必须检查strconv解析函数的error,否则会因静默失败导致业务逻辑错误;Atoi仅支持十进制int,复杂需求应使用ParseInt/ParseFloat并显式指定base和bitSize;浮点解析需防范NaN/Inf及精度问题;[]byte场景优先用ParseBytes和Append以减少内存分配。 字符串转数字必须检查
err
,否则会静默出错 Go 的
strconv
所有解析函数(
ParseInt
、
ParseFloat
、
ParseBool
、
Atoi
)都返回
(value, error)
,而
error
为
nil
才代表转换成功。不检查
err
是最常见也最危险的错误——比如
Atoi("abc")
返回
0
和
"strconv.Atoi: parsing \"abc\": invalid syntax"
,但若直接用那个
0
,业务逻辑就跑偏了。
" 123"
(带空格)、
"12.3"
(含小数点)、
""
(空串)、
"0x1F"
(带前缀)都会失败,不是“尽力而为”,而是严格拒绝 需要容忍空格?先用
strings.TrimSpace
预处理 想把浮点字符串转整?不能硬套
Atoi
,得先
ParseFloat
再手动截断+范围校验
Atoi
和
ParseInt
到底该用哪个?
Atoi
只是
ParseInt(s, 10, 0)
的快捷封装,只支持十进制
int
类型;而
ParseInt
才是真正可控的底层接口。选错会导致编译失败或运行时溢出。 变量是
int32
或
int64
?别用
Atoi
—— 它只接受
string
,只返回
int
,类型不匹配会编译报错 要解析十六进制(如
"FF"
)、二进制(
"1010"
)或八进制?必须用
ParseInt(s, base, bitSize)
,
base
设为
16
、
2
、
8
bitSize
必须显式指定:想得
int64
就写
64
,想得 Go 默认
int
?没有“自动适配”——稳妥做法是统一用
64
,再转
int
(但要注意溢出) 浮点数转换藏着精度和特殊值陷阱
ParseFloat
和
FormatFloat
看似简单,但 IEEE 754 表示导致很多隐性问题:小数无法精确存储(如
0.1
)、大整数超过
2^53
后丢失精度、输入
"NaN"
或
"Inf"
会成功返回却可能引发后续 panic。
ParseFloat("0.1", 64)
返回的不是数学意义上的 0.1,而是最接近的
float64
近似值;比较时别用
==
,改用误差范围 输入是
"NaN"
、
"Inf"
、
"-Inf"
时,
err == nil
,但结果不是普通数值——业务代码需调用
math.IsNaN
或
math.IsInf
主动过滤
FormatFloat(f, 'g', -1, 64)
中的
-1
表示“尽可能短”,但对
1e-5
这类值可能输出科学计数法,若 UI 要求固定小数位,请用
'f'
并明确设
prec
字节 切片(
[]byte
)场景下优先用
Append*
和
Parse*Bytes
高频字符串/数字互转(如日志解析、协议编解码)中,反复分配
string
会触发 GC 压力。
strconv
提供了面向
[]byte
的变体,能复用底层数组,显著减少内存分配。 Python3.6标准库参考手册(PDF版) Python3.6标准库参考手册(PDF版) 下载 立即学习 “ go语言免费学习笔记(深入) ”; 已有
[]byte
数据?用
ParseInt([]byte("123"), 10, 64)
替代
ParseInt(string(b), ...)
,避免构造临时
string
批量拼接数字?用
AppendInt(dst, i, 10)
,它把结果追加到
dst
切片里,可复用缓冲区;比多次
Itoa
+
append([]byte{}, ...)
更高效 注意:
Append*
函数不返回新切片,而是返回扩容后的
[]byte
,务必接收返回值,否则可能覆盖原数据 真正难的从来不是“怎么写”,而是“什么情况下不该用”。比如
Atoi
看似省事,但一旦需求从“十进制整数”变成“支持十六进制 ID”,就得全量替换;又比如忽略
ParseFloat
返回的
NaN
,可能让下游除零 panic 却查不出源头——这些边界,恰恰是线上事故最常藏身的地方。

相关文章