当前位置: 首页 > 面试题库 >

切片的零值不为nil

澹台展鹏
2023-03-14
问题内容

我按照示例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。

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

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

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

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


 类似资料:
  • 我就是这样做的https://tour.golang.org/moretypes/10我修改了代码,希望得到相同的结果。我没有。这是错误还是文档错误?美国之旅 nil片的长度和容量为0。 我的y变量的长度和容量为0。 这是我的输出。 我还以为会有第二个“零”~为什么我没拿到?

  • 我读过一些关于零片和空片的文章。我相信我对他们之间的差异有一些基本的了解。 我的理解总结:是nil片和返回;而是空片和 然而,这个特殊的例子仍然困扰着我。 请查看下面的链接以获取代码。我的问题是最后两个案例。https://play.golang.org/p/udyHoOlSeP 假设我想比较两个片段,重命名类型和接口匹配以及所有。接收机可以是,即使未定义为按值复制;虽然参数是按值复制的,但只要参

  • 问题内容: 我有以下代码: 但是我想将一个指向字节切片的指针传递给另一个函数,并在那里切片,所以类似: 它给我一个错误,我不能在函数参数中使用type 作为类型,并且不能对type进行切片。怎么了?默认情况下切片不是通过引用传递的吗?我试图在没有指针的情况下执行此操作,但是它不起作用- 正在复制数组。我怎样才能做到这一点? 问题答案: 该错误来自您尚未发布的拼写错误(您尝试传递一个切片而不是指向的

  • 问题内容: 我发现切片图功能和通道经常一起作为 参考类型 提及。但是我注意到,切片的东西不会表现出参考行为,就像它们会过时一样: 要么 通常,我会通过牢记切片描述符实现的内部组件来理解这一点:切片值可以视为len,cap和data指针的结构。 但是地图值永远不需要像 为什么?映射值仅仅是指向映射描述符的指针吗?如果是这样,为什么还不这样做呢? 问题答案: 在Go中,没有像C ++中那样的引用类型。

  • 问题内容: 我正在处理通过numpy.array()创建的数组,我需要在画布上绘制模拟图像的点。由于包含有意义数据的数组中心部分周围有很多零值,因此我想“修剪”该数组,删除仅包含零的列和仅包含零的行。 因此,我想了解一些本机numpy函数,甚至是要“修剪”的代码片段,或者找到“边界框”以仅对数组中包含数据的部分进行切片。 (因为这是一个概念性问题,所以我没有放置任何代码,如果可以的话,抱歉,我非常

  • 我试图实现BFS算法,以找到图中的所有路径(从src和dp)。我使用一个切片来模拟一个队列,但是当我在for循环中追加多个元素时,切片会损坏(追加没有按预期工作)。我不知道为什么。我是新来戈兰的