我正在经历Go tutorial,并且上了关于零片的课程,其中说:
nil切片的长度和容量为0,并且没有基础数组。
为了展示这一点,他们提出了有效的代码
package main
import "fmt"
func main() {
var s []int
fmt.Println(s, len(s), cap(s))
if s == nil {
fmt.Println("nil!")
}
}
但是,我尝试进行实验,并将var s []int
替换为s := []int{}
。在第一种情况下,控制台仍会打印[] 0 0
,但不再打印nil!
字符串。那么为什么第一个nil
而另一个不是?
答案 0 :(得分:3)
对于s := []int{}
:
因为它已初始化为具有基础数组,长度和容量的新类型(例如struct
)
切片初始化后,始终与包含其元素的基础数组关联。
对于var s []int
,请参见Slice types:
未初始化的切片的值为nil。
当通过声明或调用new分配变量的存储空间时,或者通过复合文字或make调用创建新值且未提供显式初始化时,变量或值被赋予默认值。此类变量或值的每个元素的类型均设置为零值:布尔值为false,数字类型为0,字符串为“”,指针为 nil ,功能,界面,切片,频道和地图。此初始化是递归完成的,因此,例如,如果未指定任何值,则结构数组的每个元素的字段都将为零。
这两个简单的声明是等效的:
var i int
var i int = 0
之后
type T struct { i int; f float64; next *T }
t := new(T)
以下内容成立:
t.i == 0
t.f == 0.0
t.next == nil
之后同样如此
var t T
我希望这会有所帮助。