跳到主要内容

零值

Go 各类型的零值分别是什么?​

  • 零值: 变量已声明但没有显式初值时得到的确定默认值,数组与结构体会逐项应用同一规则;
类型零值
boolfalse
int / uint / float / complex0
string""
pointernil
slicenil
mapnil
channelnil
functionnil
interfacenil
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()
}