
go 中整型(int)和浮点型(float32/float64)没有 nil 值,其零值为 0;只有指针、切片、map、channel、func 和 interface 等类型才支持 nil。因此需根据实际使用场景选择判断零值或检查指针是否为 nil。
go 中整型(int)和浮点型(float32/float64)没有 nil 值,其零值为 0;只有指针、切片、map、channel、func 和 interface 等类型才支持 nil。因此需根据实际使用场景选择判断零值或检查指针是否为 nil。
在 Go 语言中,nil 不是数值类型的合法值——这是初学者常踩的误区。int、int64、float32、float64 等基础数值类型都属于值类型(value types),它们在声明未初始化时自动赋予零值(zero value):所有整数类型为 0,所有浮点类型为 0.0。而 nil 仅适用于引用类型(reference types),如指针(*int)、切片([]string)、映射(map[string]int)等。
✅ 正确做法一:判断零值(适用于普通数值变量)
若你使用的是直接声明的数值变量(非指针),应检查其是否等于零值:
var age int // 零值:0
var price float64 // 零值:0.0
if age == 0 {
fmt.Println("age 未设置或为 0")
}
if price == 0.0 {
fmt.Println("price 未设置或为 0.0")
}
⚠️ 注意:此方式无法区分“用户显式设为 0”和“未初始化/默认零值”。若业务逻辑要求严格区分(例如 API 参数中 0 是有效值,而“未提供”需特殊处理),则必须改用指针类型。
✅ 正确做法二:使用指针并判 nil(适用于需表达“未设置”语义)
当需要明确表达“该值不存在/未提供”时,应定义为指针类型,并通过 == nil 判断:
package main
import "fmt"
func main() {
var score *float64 // 声明为 *float64,初始值为 nil
if score == nil {
fmt.Println("score 尚未赋值(即‘空’)")
} else {
fmt.Printf("score 已设置:%.2f\n", *score)
}
// 赋值示例
actual := 95.5
score = &actual
if score != nil {
fmt.Printf("score 已设置:%.2f\n", *score) // 输出:95.50
}
}
? 补充说明与最佳实践
-
JSON 场景常见需求:在结构体中接收 JSON 数据时,若某数值字段可选,推荐使用指针类型,以便 omitempty 标签配合 nil 实现“零值不序列化”:
type User struct { ID int `json:"id"` Score *int `json:"score,omitempty"` // 为 nil 时不输出到 JSON Level *string `json:"level,omitempty"` } -
避免误判:不要对非指针数值类型写 if x == nil,编译器会直接报错,例如:
var x float32 // if x == nil { ... } // ❌ 编译错误:cannot compare float32 to nil 零值 ≠ 错误:Go 的零值是安全、确定且有意设计的。除非业务语义要求“非零才有效”,否则无需一律视为异常。
总之,Go 中不存在“空数值”的概念——只有“零值”和“nil 指针”两种语义。合理选择类型(值 or 指针)是写出清晰、健壮代码的关键。










