我按照示例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我以为会有第二个“零”~为什么我不明白呢?
发布于 2015-06-12 15:46:46
您所引用的文档指出,零片的长度和容量为0,但并不是每个长度和容量为零的切片都是零片。规格只表示未初始化的片的值为零。
这是在未初始化的片上支持len和cap的一种方便。否则,我们将需要首先检查非零,以避免恐慌。(这也适用于其他内置类型,如地图或通道。)
在fmt.Print输出方面,行为上的差异类似于打印未初始化(无)指针与指向空结构的指针:
var s *struct{} // uninitialised pointer
fmt.Println(s) // <nil>
s = &struct{}{} // pointer to an empty structure
fmt.Println(s) // &{}发布于 2017-08-28 12:27:30
nil与empty切片
如果我们想到这样的一片:
[pointer] [length] [capacity]然后:
nil slice: [nil][0][0]
empty slice: [addr][0][0] // it points to an address出发地:“行动起来”书: 零片 当您希望表示不存在的切片时,它们非常有用,例如在返回片的函数中发生异常时。 //创建整数的零段。var片[]int 空片 当您想要表示一个空集合时,例如当数据库查询返回零结果时,空片非常有用。 //使用make创建一个空的整数片。切片:= make([]int,0) //使用一个切片文字来创建一个空的整数片。片:= []int{} 无论您使用的是零片还是空片,内置函数
append、len和cap的工作方式都是一样的。
package main
import (
"fmt"
)
func main() {
var nil_slice []int
var empty_slice = []int{}
fmt.Println(nil_slice == nil, len(nil_slice), cap(nil_slice))
fmt.Println(empty_slice == nil, len(empty_slice), cap(empty_slice))
}指纹:
true 0 0
false 0 0发布于 2015-06-12 20:42:37
在这种情况下:
var z []int 您已经声明了一个变量z,但是没有初始化它。
在这种情况下:
y := []int {}您声明并初始化它,然后将其设置为空片。用很长的路写出第二个表达式可以使这两个表达式之间的区别更加清楚:
var y []int = []int {}https://stackoverflow.com/questions/30806931
复制相似问题