go 的零值总结

面试中经常遇到,特此总结一下。

bool int float string 零值
func main() {
   var i int
   var f float64
   var b bool
   var s string
   fmt.Printf("%v %v %v %q\n", i, f, b, s)
}

输出:

image.png
指针 零值
slice 零值

slice 的零值是nil

var s1 []string  

nil slice 的 len 和 cap 都为 0

func main() {
    var s1 []string  
    fmt.Println("len:", len(s1), "cap:", cap(s1))
}
image.png

但是 nil slice 追加是安全的

func main() {
    var s1 []string  
    s1 = append(s1, "hello")    
}
map 零值

map 的零值是nil

var m map[string]int  

nil map 的 len 为0

func main() {
    var m map[string]int 
    fmt.Println("len:", len(m))   
}
image.png

同时,在对一个 nil map 进行插入会导致 panic

func main() {
    var m map[string]int 
    m["tom"] = 12    // panic
}

但是查找和删除是安全的。

func main() {
    var m map[string]int
    v, exist := m["tom"]
    if exist {
        fmt.Println(v)
    } else {
        fmt.Println("not found")
    }

    delete(m, "tom")
}
channel 零值

channel 的零值是nil

var a chan int   // nil 通道

读写一个 nil channel 会一直阻塞。

function 零值

TODO

nil

nil 是go语言中预先定义的标识符,不是关键字或保留字。这可以让我们直接定义一个名称为 nil 的变量(并不推荐这样做),比如下面这样:

var nil = errors.New("nil")

不同类型的nil值占用的内存大小可能是不一样的:

var p *struct{} = nil
fmt.Println(unsafe.Sizeof(p)) // 8

var s []int = nil
fmt.Println(unsafe.Sizeof(s)) // 24

var m map[int]bool = nil
fmt.Println(unsafe.Sizeof(m)) // 8
go为什么需要零值机制?

1、将一个值设置为已知默认值的特性,对于程序的安全性和正确性非常重要。
2、零值机制使得 sync.Mutex,slices等无需显式初始化就可以使用,开箱即用。
3、同时还可以使你的 Go 程序更加简单和紧凑。

你可能感兴趣的:(go 的零值总结)