我按照示例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
我期待第二个“零”〜我为什么不明白呢?
您参考的文档指出 零个切片的长度和容量为0, 但并非 每个 长度和容量为零的切片都是零个切片。规范仅说 未初始化的 片的值为nil。
这是一个方便的支撑len和cap在其上未初始化(无)切片。否则,我们将需要首先检查非零以避免恐慌。(这也适用于其他内置类型,例如地图或渠道。)
len
cap
在fmt.Print输出方面,行为上的差异类似于打印未初始化的(nil)指针与指向空结构的指针:
fmt.Print
var s *struct{} // uninitialised pointer fmt.Println(s) // <nil> s = &struct{}{} // pointer to an empty structure fmt.Println(s) // &{}