go 中 int 位数取决于 runtime.goarch:amd64 下为 64 位,386 下为 32 位;浮点计算存在精度丢失,金融场景应使用 int64 或 decimal 库,比较需用误差范围。

Go 里 int 到底是多少位?别硬背,看 runtime.GOARCH
Go 的 int 和 uint 不是固定 32 位或 64 位,它取决于当前运行环境的架构。在 64 位系统上通常是 64 位,32 位系统上就是 32 位——这会让跨平台编译或依赖内存布局的代码出问题。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 需要确定位宽时,直接用
int64、int32等明确类型,而不是int - 检查当前环境:运行
fmt.Println(runtime.GOARCH),常见值为amd64(对应 64 位int)或386(对应 32 位int) - 序列化(如 JSON、binary.Write)或与 C 交互时,
int是隐患高发区,必须显式转换
float32 和 float64 在计算中会“悄悄”丢精度
Go 默认浮点字面量类型是 float64,但如果你声明变量为 float32,赋值时不会报错,却可能因舍入导致意外结果——比如 0.1 + 0.2 != 0.3 在两种类型下误差程度不同。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 金融类计算别用浮点型,改用
int64存“分”,或引入github.com/shopspring/decimal - 比较浮点数用误差范围,而不是
==:math.Abs(a-b) -
float32节省内存但精度约 6–7 位十进制,float64约 15–16 位;图像处理等对吞吐敏感场景可选float32,科学计算优先float64
布尔值不能和整数互转,true == 1 会编译失败
Go 没有隐式类型转换,bool 和 int 完全不兼容。你不能把 flag.Bool 返回的 *bool 直接传给期望 int 的函数,也不能用 if x == 1 判断布尔值。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 需要映射布尔到数字时,显式写三元表达式:
val := map[bool]int{true: 1, false: 0}[b]或if b { val = 1 } else { val = 0 } - 命令行参数解析中,
flag.Bool返回的是*bool,取值要解引用:*myFlag,不是myFlag - 数据库驱动(如
database/sql)读BOOLEAN字段时,目标变量必须是*bool,填*int会 panic 报错sql: Scan error on column index 0: destination not a pointer
零值陷阱:声明未初始化的变量不是“空”,而是语言定义的默认值
Go 所有变量声明即初始化,int 是 0,float64 是 0.0,bool 是 false。这看着省事,但在判断“用户是否设置过该字段”时,0 和 false 无法区分是默认值还是有意输入。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 需要表达“未设置”语义时,用指针或封装类型:
*int、*bool,或自定义type Status int配合const (Unknown Status = iota; Active; Inactive) - 结构体 JSON 序列化时,零值字段仍会输出,想跳过得加 tag:
json:",omitempty",但注意它只对零值有效,对*bool类型还要确保指针本身非 nil - 函数参数若接收
bool,调用方传false无法判断是“关”还是“没填”,应考虑改用*bool或选项函数模式
类型零值是 Go 的确定性设计,不是 bug,但容易让人误以为“没赋值=未定义”。真要表达“缺失”,就得靠类型系统主动表达,而不是依赖运行时行为。










