Go零值机制
Go变量声明后自动初始化为类型的零值,无需手动初始化。
各类型零值
数值类型零值
Go
var i int // 0
var f float64 // 0.0
var c complex128 // 0+0i
fmt.Println(i) // 0
fmt.Println(f) // 0
布尔类型零值
Go
var b bool // false
fmt.Println(b) // false
字符串类型零值
Go
var s string // ""(空字符串)
fmt.Println(s) // ""
fmt.Println(len(s)) // 0
指针类型零值
Go
var p *int // nil
fmt.Println(p) // nil
fmt.Println(p == nil) // true
复合类型零值
Go
// 数组
var a [5]int // [0, 0, 0, 0, 0]
// slice
var s []int // nil
// map
var m map[string]int // nil
// channel
var ch chan int // nil
// 函数
var f func() // nil
// interface
var i interface{} // nil
// struct
var u User // 所有字段零值
结构体零值
所有字段零值
Go
type User struct {
Name string
Age int
Admin bool
}
var u User
fmt.Println(u.Name) // ""
fmt.Println(u.Age) // 0
fmt.Println(u.Admin) // false
指针字段零值
Go
type Config struct {
Name string
Data *Data
}
var c Config
fmt.Println(c.Name) // ""
fmt.Println(c.Data) // nil
零值类型表
| 类型 | 零值 |
|---|---|
| int, float等 | 0 |
| bool | false |
| string | "" |
| 指针 | nil |
| slice | nil |
| map | nil |
| channel | nil |
| 函数 | nil |
| interface | nil |
| 数组 | 所有元素零值 |
| struct | 所有字段零值 |
nil与零值
nil是特定类型的零值
Go
// nil是以下类型的零值:
// 指针、slice、map、channel、函数、interface
var p *int = nil
var s []int = nil
var m map[int]int = nil
var ch chan int = nil
var f func() = nil
var i interface{} = nil
nil不能直接使用
Go
var m map[string]int // nil map
m["key"] = 1 // panic! nil map不能写入
// 正确:先初始化
m = make(map[string]int)
m["key"] = 1 // OK
Go
var s []int // nil slice
s[0] = 1 // panic! nil slice不能索引写入
// 正确:先初始化
s = make([]int, 1)
s[0] = 1 // OK
nil slice/map可以读取(返回零值),但不能写入。
零值的优点
避免未初始化问题
Go
// C语言未初始化问题
int a; // 可能是任意值
// Go零值机制
var a int // 必定是0,安全
结构体安全初始化
Go
// 只需设置非零值字段
u := User{
Name: "Tom",
// Age默认0
// Admin默认false
}
零值用途
判断是否初始化
Go
var m map[string]int
if m == nil {
m = make(map[string]int) // 初始化
}
检查配置
Go
type Config struct {
Port int
}
func (c Config) GetPort() int {
if c.Port == 0 {
return 8080 // 默认值
}
return c.Port
}
要点总结
- Go变量自动初始化为零值
- 数值零值是0,布尔是false
- 字符串零值是空字符串""
- 指针、slice、map、channel零值是nil
- 结构体所有字段自动零值
- nil map/slice不能写入,panic
- 零值机制避免未初始化问题
- 用==nil判断是否已初始化
📝 发现内容有误?点击此处直接编辑