Go语言不自动类型转换,强制转换T(v)直接按二进制位重解释;float64转int向零截断,如int(3.9)=3、int(-3.9)=-3;需四舍五入应手动加偏移或用math.Round()再转;int64转int32溢出时不报错,仅低32位截断,生产环境须先校验范围。

Go语言不自动做类型转换,数值精度完全由你写的转换逻辑决定。直接用 T(v) 强制转,就等于把原始二进制位按目标类型重新解释——该丢的丢、该溢的溢、该截的截,编译器不会拦,运行时也不会报错。
float64 转 int 为什么会丢小数?
因为 Go 的浮点转整型是向零截断(truncation),不是四舍五入。这跟底层硬件行为一致,也避免引入隐式舍入逻辑。
-
int(3.9)得到3,int(-3.9)得到-3 - 如果需要四舍五入,得手动加偏移:比如
int(float64(x) + 0.5)(仅适用于正数)或用math.Round()后再转 - 注意
math.Round()返回float64,仍需显式转成整型,例如int(math.Round(3.7))→4
int64 转 int32 容易溢出但不报警
Go 编译器允许这种转换,只要语法合法;但若值超出目标类型范围,结果是取低 N 位后的补码值,属于未定义语义下的确定性截断。
-
int32(10000000000)不会 panic,但结果是-1486618624(因高位被丢弃) - 生产环境应先判断范围:
if x > math.MaxInt32 || x - 别依赖
int32(x)自动“安全缩放”,它不做任何检查
字符串和数字互转必须用 strconv 包
不能写 int("123") 或 string(123) —— 前者编译失败,后者是把数字当 Unicode 码点转成单字符(如 string(65) 是 "A")。
- 数字转字符串优先用
strconv.Itoa()(仅限int)或strconv.FormatInt(i, 10)(支持任意整型) - 字符串转数字必须检查
error:n, err := strconv.Atoi(s);空字符串、带空格、非数字字符都会让err != nil - 解析浮点数用
strconv.ParseFloat(s, 64),第二个参数指定精度(32 或 64),别漏掉
自定义类型之间不能靠底层相同就混用
哪怕 type Celsius float64 和 float64 二进制完全一样,它们仍是不同类型,赋值或传参时必须显式转换。
-
var t Celsius = 25.5,想传给接受float64的函数?得写someFunc(float64(t)) - 两个自定义类型即使字段完全一致(如
type A struct{ X int }和type B struct{ X int }),也不能直接转换,必须逐字段赋值或用反射 - 接口断言(
v.(T))失败时返回零值+false,别忽略ok判断,否则可能用到意外的零值
最常被忽略的一点:所有 T(v) 形式的数值转换都假设你已确认值域安全。Go 把责任交给你,而不是在运行时兜底——这意味着边界检查、错误处理、精度取舍,全得在调用前想清楚。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











