当前位置: 首页 > 知识库问答 >
问题:

在golang有零片和空片有什么意义?

喻子航
2023-03-14

区分零片(即未初始化片)和空片(即已初始化但为空片)的要点是什么?

我理解其中的差异,但我想知道,这两种情况之间存在细微差异的背后动机是什么?出于所有目的,nil片和空片在使用它们时的行为是相同的。

似乎如果Go开发人员只有一个案例,例如只允许空切片,那么它就简化了心智模型并消除了细微缺陷的来源。

创建这两个用例有什么原因吗?

共有1个答案

陈正业
2023-03-14

nil切片值不需要分配。如果您希望在片中构建某些内容,但通常不会附加任何数据,因此片可能会保持nil,因此不需要进行分配,这可能会有所不同。

空片可能需要分配,即使其容量为零。

另外,空切片表示其长度为0,但其容量可能不是;因此,“无论出于何种目的,一个nil片和一个空片在使用它们时的行为都是相同的”这不是真的。您可以分配长度为0且容量大的切片,并优化进一步的追加以避免分配(和复制):

s := make([]int, 0)
fmt.Println(s, len(s), cap(s))
s = append(s, 1)
fmt.Println(s, len(s), cap(s))

s = make([]int, 0, 10)
fmt.Println(s, len(s), cap(s))
s = append(s, 1)
fmt.Println(s, len(s), cap(s))

以上内容的输出(在运动场上尝试):

[] 0 0
[1] 1 2
[] 0 10
[1] 1 10

我们看到了什么?在第一个示例中,我们创建了一个长度为0、容量为0的空切片。如果我们给它追加一个元素,它的长度将变成1(很明显),它的容量增加到2。这是因为在引擎盖下append()分配了一个大小为2的新数组(考虑到未来的增长),复制了现有的元素(在本例中没有),并分配了新元素。

在第二种情况下,我们从一个空切片开始,但容量为10。这意味着我们可以向其追加10个元素,而不会导致新的分配和复制现有元素。当切片很大时,这可能是一个很大的优势,需要多次这样做。

 类似资料:
  • 问题内容: 在laravel框架中,我们可以使用Blade在HTML文件中添加PHP代码。 我们在Laravel的刀片文件中同时使用和语法。 它们之间有什么区别? 问题答案: 刀片{{}}语句通过PHP的htmlentities函数自动发送,以防止XSS攻击。 如果您使用某些HTML样式将数据从Controller传递到View,例如: 然后在Blade中对其进行访问,则输出为: 但是,如果使用进

  • 在我的片段中,我想在加载一些数据后干杯,如下所示: 这只有在片段仍然附加到活动的情况下才有意义,即片段是可见的,而getActive()不会返回null。 我可以用或使用isAdded(),对吗?在这里,我想知道这两种方法之间的区别是什么,我最好使用哪一种?

  • 问题内容: 我在遍历包含接口切片的接口切片时遇到麻烦。 通过尝试使用返回JSON数据的API调用产生了此问题。返回的数据很多,根据请求的不同,结构也有很大不同。API文档中也没有JSON响应的结构,因此我试图实现一些用于处理任意JSON响应的方法。 当前,当进行初始调用时,将其放入map [string] interface {}中,然后运行switch语句以确定每个元素的类型,当遇到一片接口时就

  • 问题内容: 很多情况下在golang中使用 nil 。例如: 但是我们不能这样使用它: Golang编译器将引发错误。 看起来只能用于struct和interface的指针。如果是这样, 那意味着什么? 而 当我们用它来比较其他对象,他们如何比较,换句话说,如何golang确定一个对象是零 ? 编辑:例如,如果接口为nil,则其类型和值必须同时为nil。 golang如何做到这一点? 问题答案:

  • 问题内容: 如果我已经在大多数主流浏览器中测试过我的页面,为什么我需要维护一个经过验证的代码?如果WebKit浏览器和Firefox支持框阴影和拐角半径,我想使用它们。我不在乎它们是否不会出现在Internet Explorer中。但是我通过不包含图像来降低HTTP请求的数量。 有效代码是否有优势?在搜索引擎优化还是其他方式? 问题答案: Google更喜欢它,因此对SEO很有好处。 它使您的网页

  • Android开发人员指南有一个不错的部分是关于片段的使用。使用片段的一种方法是没有UI。有几个参考使用这作为一种背景处理的手段,但碎片给这一领域带来了什么好处?我会选择在线程、AsyncTasks、处理程序等上使用片段进行后台处理?