为什么这个零长度和零容量切片不为零?

时间:2019-10-25 10:20:57

标签: go

我正在经历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而另一个不是?

1 个答案:

答案 0 :(得分:3)

对于s := []int{}
因为它已初始化为具有基础数组,长度和容量的新类型(例如struct

  

切片初始化后,始终与包含其元素的基础数组关联。

对于var s []int,请参见Slice types

  

未初始化的切片的值为nil。

The zero value

  

当通过声明或调用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

我希望这会有所帮助。