strconv.ParseFloat 是最直接可靠的方式,它要求显式解析、返回 float64 和 error,严格校验输入格式,支持科学计数法但拒绝非法字符,必须检查 err 且不推荐 fmt.Sscanf 替代。

用 strconv.ParseFloat 是最直接可靠的方式
Go 没有隐式类型转换,string 到 float64 必须显式解析。strconv.ParseFloat 是标准库唯一推荐的方案,它返回 float64 和错误,不支持 float32 直接输出(需手动转换)。
常见错误现象:直接用 float64("3.14") 编译失败;或误用 fmt.Sscanf 处理非法输入时 panic 或静默失败。
-
strconv.ParseFloat(s, 64)第二个参数必须是64(对应float64)或32(返回float64再转float32,精度可能丢失) - 空字符串、含空格、字母、多个小数点都会返回
strconv.ErrSyntax - 科学计数法如
"1e2"、"-3.5e-1"是合法的,会被正确解析 - 如果只要
float32,写成float32(strconv.ParseFloat(s, 32))不行 —— 必须先用64解析再强制转,否则精度截断发生在解析阶段
处理无效输入时别忽略 err
几乎所有线上出问题的 case 都源于没检查 err。比如用户提交表单字段是空、带单位("123.45kg")、或用了中文逗号("123,45"),ParseFloat 会直接返回错误,不是零值。
使用场景:API 请求参数校验、配置文件读取、CSV 数值列解析。
立即学习“go语言免费学习笔记(深入)”;
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 永远用
if err != nil分支处理,而不是默认设为0—— 零可能是有效业务值(如温度 0℃) - 不要用
panic或日志后继续执行,除非你明确知道这个错误不该发生且无法恢复 - 若需容错(例如允许前后空格),先用
strings.TrimSpace,但注意它不处理全角空格或 BOM
fmt.Sscanf 能用,但不推荐用于纯字符串转浮点
fmt.Sscanf 看起来更“灵活”,支持格式化读取,但它本质是扫描器,设计目标不是健壮解析,而是从混合文本中提取值。它对格式错误容忍度高,容易掩盖问题。
性能 / 兼容性影响:比 ParseFloat 慢 3–5 倍(基准测试可见),且在 Go 1.20+ 中对 Unicode 数字字符行为不一致。
-
var f float64; fmt.Sscanf("3.14", "%f", &f)成功,但"3.14abc"也会成功(只读前缀),而ParseFloat会报错 -
" 3.14 "在Sscanf下能过,但ParseFloat要求严格格式 —— 这正是你需要的:明确区分“可解析”和“含杂质” - 如果真要用
Sscanf,务必加%n检查是否消费了全部输入,否则逻辑可能错位
注意 NaN 和 Inf 的行为差异
ParseFloat 默认允许 "NaN"、"Inf"、"-Inf",它们是合法浮点字面量。但多数业务系统不期望这些值,它们会导致后续计算异常或数据库写入失败。
容易踩的坑:前端传了 "NaN" 字符串(比如 JS Number(undefined).toString()),后端没拦截就进来了。
- 若需禁止,解析后加判断:
math.IsNaN(f) || math.IsInf(f, 0) -
ParseFloat("inf", 64)返回+Inf,不是错误 —— 这是符合 IEEE 754 的,但不是所有业务能接受 - 数据库驱动(如
lib/pq)通常不支持NaN插入,会报错,得提前拦住

















