在学习 Go 切片的时候,发现官方例子与我的实验结果有出入,我本以为两种写法得到的结果是一样的,但是做了实验之后发现,虽然两种 slice 表现出的动作差不多,但是还是牵扯到理论问题。
package main
import (
"fmt"
)
func main() {
s := []int{}
var ss []int
check("s", s)
check("ss", ss)
}
func check(id string, s []int) {
if s == nil {
fmt.Println(id, "is nil")
} else {
fmt.Println(len(s), cap(s))
}
}
运行结果:
image.png可见,虽然二者的 cap 和 len 都为0,但是一个是 nil slice,而另一个是 non-nil slice。这是因为当一个 slice 没有初始化时(uninitialized),它就是 non-nil 的。s 使用了:=
操作符,而:=
和=
的区别之一就是前者带了一次构建(construct)的操作,即初始化(initialize),所以 s 是一个已经初始化的 slice,而 ss 还没有初始化(和 C# List<T> list;
之后并没有接new
同理)。
参考:https://stackoverflow.com/questions/30806931/the-zero-value-of-a-slice-is-not-nil
网友评论