一尘不染

切片的零值不为nil

go

我按照示例https://tour.golang.org/moretypes/10
进行了修改,希望得到相同的结果。我没有。这是错误还是文档错误?巡回演出

无切片的长度和容量为0。

我的y变量的长度和容量为0。

package main

import "fmt"

func myPrint(z []int) {
    fmt.Println(z, len(z), cap(z))
    if z == nil {
        fmt.Println("nil!")
    }
}

func main() {
    var z  []int 
    y := []int {}
    myPrint(z)
    myPrint(y)
}

这是我的输出。

[] 0 0
nil!
[] 0 0

我期待第二个“零”〜我为什么不明白呢?


阅读 232

收藏
2020-07-02

共1个答案

一尘不染

您参考的文档指出 零个切片的长度和容量为0, 但并非 每个
长度和容量为零的切片都是零个切片。规范仅说 未初始化的
片的值为nil。

这是一个方便的支撑lencap在其上未初始化(无)切片。否则,我们将需要首先检查非零以避免恐慌。(这也适用于其他内置类型,例如地图或渠道。)

fmt.Print输出方面,行为上的差异类似于打印未初始化的(nil)指针与指向空结构的指针:

var s *struct{} // uninitialised pointer
fmt.Println(s)  // <nil>

s = &struct{}{} // pointer to an empty structure
fmt.Println(s)  // &{}
2020-07-02