go中所有类型变量声明后自动初始化为零值,如int为0、bool为false、string为空字符串、指针/map/slice等为nil,struct各字段按类型取零值;零值是语言强制语义,非默认值,且nil map/slice需make后才能安全使用。

Go 中所有类型变量声明后自动初始化为零值
Go 不允许未初始化的变量存在,只要声明(var x int 或 x := 0 以外的短声明),编译器就一定赋予其对应类型的零值。这不是“默认值”,而是语言强制语义——没有“未定义”状态。
常见类型的零值可以直接查文档或用 print 验证
最直接的办法是打印出来看,但要注意:必须确保变量已声明且未被显式赋值,否则看到的是你给的值,不是零值。
-
int、int64、float64→0、0、0.0 -
bool→false -
string→""(空字符串,不是 nil) -
pointer、map、slice、func、channel、interface{}→nil - struct 类型 → 所有字段按各自类型取零值(例如
struct{a int; b string}的零值是{0, ""})
示例:
var s []int var m map[string]int var p *int fmt.Println(s == nil) // true fmt.Println(m == nil) // true fmt.Println(p == nil) // true
用 reflect.Zero 获取任意类型的零值(调试/元编程场景)
如果需要在运行时动态获取某类型的零值(比如写泛型工具或反射逻辑),可以用 reflect.Zero,但它返回的是 reflect.Value,需调用 .Interface() 才能转回原始类型。
- 仅适用于已知类型(
reflect.TypeOf(x)可得) - 不能用于未导出字段的 struct 零值构造(会 panic)
- 性能开销大,别在热路径用
示例:
t := reflect.TypeOf([]string{})
z := reflect.Zero(t).Interface()
fmt.Printf("%v, %T\n", z, z) // [], []string
容易忽略的关键点:零值 ≠ 未初始化,也不等于“安全可直接用”
比如 map 和 slice 的零值是 nil,但直接对它们调用 len() 没问题,而 append() 或 map[key] = val 会 panic。这时候需要显式初始化:m := make(map[string]int 或 s := make([]int, 0)。
另一个坑是 struct 字段:即使整个 struct 是零值,其中某个 map 字段仍是 nil,不单独初始化就访问会 crash。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











