cast不处理溢出,而是静默归零或截断:toint/toint64超范围返回0,touint负数也返回0,布尔转整数为1/0;防溢出须用toxxxe配合显式范围校验。

cast 不处理溢出,它只做“直觉式截断”或“安全兜底”,真要防溢出得自己加逻辑。
cast.ToInt 和 cast.ToInt64 遇到超范围值会怎样
它们不会 panic,也不会报错,而是直接按目标类型能容纳的范围做截断或归零:
-
cast.ToInt("999999999999")→ 返回0(因为 int 在 32 位系统上最大约 21 亿,超出后 strconv.ParseInt 失败,cast 返回零值) -
cast.ToInt64("999999999999999999999")→ 返回0(同样因超出 int64 范围,解析失败) -
cast.ToInt(999.9)→ 返回999(浮点转整数时直接截断小数,不四舍五入,也不检查是否溢出) -
cast.ToInt(true)→ 返回1,cast.ToInt(false)→ 返回0(布尔转整数是确定行为,无溢出问题)
cast.ToUint 系列对负数的处理就是“归零”
Go 的无符号整型不能存负数,但 cast.ToUint 不会 panic,也不会返回 error —— 它把所有无法表示为正整数的输入都变成 0:
-
cast.ToUint("-5")→0 -
cast.ToUint(-10)→0 -
cast.ToUint(int64(-1))→0 -
cast.ToUint("0")→0(合法,不是错误)
这意味着你无法靠返回值区分“原始值就是 0”和“转换失败了”。要用 ToUintE 才能拿到 error 判断原因。
真正需要防溢出时,必须用 ToXXXE + 显式范围检查
cast 本身不提供溢出校验,它的设计哲学是“失败即零值”。如果你的业务要求严格(比如配置端口不能大于 65535、用户 ID 必须在 uint32 范围内),就得手动补一层:
- 用
cast.ToInt64E或cast.ToUint32E获取原始解析结果和 error - error 不为空 → 输入非法(如非数字字符串)
- error 为空但值超出业务范围 → 你自己 reject,比如
if port > 65535 { return errors.New("port out of range") } - 别依赖
cast.ToInt的返回值做边界判断,它连int是 32 位还是 64 位都不保证,更不管你的业务上限
float 转 int 的截断行为容易被当成“溢出处理”
cast.ToInt(1e10) 在 32 位 int 环境下可能返回 0 或一个错误截断值(取决于底层 strconv.ParseInt 行为),但 cast 不暴露这个细节。它只保证:
- 能 parse 成整数 → 截断小数后转成目标整型(可能溢出,但不报)
- parse 失败(如 "inf"、"nan"、超长数字)→ 返回零值
- 所以
cast.ToInt("1000000000000")在 32 位环境大概率是0,但你无法知道是“字符串太长”还是“刚好是 0”
这种静默归零正是 cast 的设计取舍:简化日常使用,代价是关键路径必须用 E 版本 + 自行校验。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











