首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >切片的零值不是零。

切片的零值不是零。
EN

Stack Overflow用户
提问于 2015-06-12 15:33:48
回答 5查看 29.2K关注 0票数 22

我按照示例https://tour.golang.org/moretypes/10修改了代码,希望得到相同的结果。我没有。这是错误,还是文档错误?旅游州

零片的长度和容量为0。

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

代码语言:javascript
复制
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)
}

这是我的输出。

代码语言:javascript
复制
[] 0 0
nil!
[] 0 0

我以为会有第二个“零”~为什么我不明白呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-06-12 15:46:46

您所引用的文档指出,零片的长度和容量为0,但并不是每个长度和容量为零的切片都是零片。规格只表示未初始化的片的值为零。

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

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

代码语言:javascript
复制
var s *struct{} // uninitialised pointer
fmt.Println(s)  // <nil>

s = &struct{}{} // pointer to an empty structure
fmt.Println(s)  // &{}
票数 19
EN

Stack Overflow用户

发布于 2017-08-28 12:27:30

nilempty切片

如果我们想到这样的一片:

代码语言:javascript
复制
[pointer] [length] [capacity]

然后:

代码语言:javascript
复制
nil slice:   [nil][0][0]
empty slice: [addr][0][0] // it points to an address

出发地:“行动起来”书: 零片 当您希望表示不存在的切片时,它们非常有用,例如在返回片的函数中发生异常时。 //创建整数的零段。var片[]int 空片 当您想要表示一个空集合时,例如当数据库查询返回零结果时,空片非常有用。 //使用make创建一个空的整数片。切片:= make([]int,0) //使用一个切片文字来创建一个空的整数片。片:= []int{} 无论您使用的是零片还是空片,内置函数appendlencap的工作方式都是一样的。

去操场的例子

代码语言:javascript
复制
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))

}

指纹:

代码语言:javascript
复制
true 0 0
false 0 0
票数 27
EN

Stack Overflow用户

发布于 2015-06-12 20:42:37

在这种情况下:

代码语言:javascript
复制
var z []int 

您已经声明了一个变量z,但是没有初始化它。

在这种情况下:

代码语言:javascript
复制
y := []int {}

您声明并初始化它,然后将其设置为空片。用很长的路写出第二个表达式可以使这两个表达式之间的区别更加清楚:

代码语言:javascript
复制
var y []int = []int {}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30806931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档