
go 中整型和浮点型没有 nil 值,其零值为 0;若需表达“未设置”语义,应使用指针类型并判空,而非直接与 nil 比较。
go 中整型和浮点型没有 nil 值,其零值为 0;若需表达“未设置”语义,应使用指针类型并判空,而非直接与 nil 比较。
在 Go 语言中,基本数值类型(如 int、int32、float64 等)是值类型,不支持 nil。它们在声明但未显式初始化时,会自动赋予对应的零值(zero value):所有整数类型的零值是 0,所有浮点类型的零值是 0.0。因此,以下写法是错误的:
var foo float32
if foo == nil { // ❌ 编译错误:cannot convert nil to type float32
// ...
}✅ 正确做法一:检查零值(适用于“0 是否代表空”的业务场景)
若业务逻辑中 0 明确表示“未设置”或“无效值”,可直接与零值比较:
var score float64
if score == 0 {
fmt.Println("分数未设置或为零")
}
var count int32
if count == 0 {
fmt.Println("计数为空")
}⚠️ 注意:此方式有歧义——无法区分“用户明确设为 0”和“变量未初始化”。仅推荐用于零值本身无业务意义的场景(例如 ID 字段通常非零)。
✅ 正确做法二:使用指针类型(推荐,语义清晰)
当需要严格区分“未设置”与“设为零”时,应改用指针类型(如 *int、*float64)。此时 nil 才具有明确的“空”语义:
package main
import "fmt"
func main() {
var age *int // nil 指针,表示“未提供年龄”
var price *float64 // 同样为 nil
if age == nil {
fmt.Println("年龄信息缺失")
} else {
fmt.Printf("年龄:%d\n", *age)
}
if price == nil {
fmt.Println("价格未指定")
} else {
fmt.Printf("价格:%.2f\n", *price)
}
// 赋值示例:
realAge := 28
age = &realAge
fmt.Printf("赋值后年龄:%d\n", *age) // 输出:28
}? 补充说明
- Go 的 nil 仅适用于指针、切片、映射、通道、函数、接口等引用类型;
- 数值类型(int/float32/bool/string 等)的零值是语言规范定义的默认初始值,不是 nil;
- 在结构体中,若某数值字段需支持“空”语义,建议将其定义为指针类型,或使用 sql.NullInt64 等包装类型(尤其在数据库交互中)。
✅ 总结
| 场景 | 推荐方式 | 示例 |
|---|---|---|
| 零值即“空”,且业务允许混淆 | 直接比较零值 | if x == 0 |
| 需严格区分“未设置”与“设为 0” | 使用指针类型 + == nil 判空 | if x == nil |
| 与数据库交互(如 NULL 字段) | 使用 sql.NullInt64、sql.NullFloat64 等 | if val.Valid { ... } |
牢记:Go 中没有“空数值”,只有“零值”和“nil 指针”——选择哪种语义,取决于你的业务需求。

















