零值
Go 各类型的零值分别是什么?
- 零值: 变量已声明但没有显式初值时得到的确定默认值,数组与结构体会逐项应用同一规则;
| 类型 | 零值 |
|---|---|
| bool | false |
| int / uint / float / complex | 0 |
| string | "" |
| pointer | nil |
| slice | nil |
| map | nil |
| channel | nil |
| function | nil |
| interface | nil |
| struct | 各字段零值组合 |
| array | 各元素零值组合 |
nil 是什么, 哪些类型可以与 nil 比较?
- nil: pointer, slice, map, channel, function, interface 的零值;
- 非类型值: nil 本身没有默认具体类型;
- 比较限制: 只能与可为 nil 的类型值比较;
var p *int = nil // pointer 零值
var s []int = nil // slice 零值
var m map[string]int // map 零值为 nil
println(p == nil, s == nil, m == nil)
如何判断一个零值是否可以直接用于当前操作?
- 零值可用: 部分类型零值即可直接使用;
- nil slice: 可
append, 但不能按索引写入不存在元素; - nil map: 可读取,但必须先用
make或 map 字面量初始化,才能写入;
package main
import "sync"
func main() {
var mu sync.Mutex // sync.Mutex 零值表示未加锁状态
mu.Lock()
mu.Unlock()
}