面试中经常遇到,特此总结一下。
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 程序更加简单和紧凑。
网友评论