Golang 「陷阱」




总结一些 Golang 常见的「陷阱」。

当 slice 或 map 为 nil

1
2
var s []int
s = append(s, 1)

slicenil 时,可以直接添加元素。

1
2
var m map[string]struct{}
m["key"] = struct{}{} // panic: assignment to entry in nil map

mapnil 时,不可以直接添加元素,直接添加将会 panic

make slice 后 append 新元素

new 基本上可以为任何类型分配空间,make 只能为 slicemapchan 分配空间并初始化。new 的结果类型是其第一的个传入参数的指针类型,make 的结果类型是与其第一个传入的参数类型一致。这里有个我刚开始使用 make 时犯的错误:

1
2
3
var m = make([]int, 10)
m = append(m, 1024)
fmt.Println(m) // [0 0 0 0 0 0 0 0 0 0 1024]

makeslice 初始化时,必须传入第二个参数,即容量参数。append 是在初始容量后增加元素,而不是在首位开始增加元素。

nil 无法初始化不使用显示类型的变量

1
var v = nil // Cannot assign nil without explicit type

nil 用于表示 interfacefuncmapslicechan零值。如果不指定变量的类型,编译器将无法编译代码,因为它不知道变量具体的类型。

本文结束 感谢阅读