区分零片(即未初始化片)和空片(即已初始化但为空片)的要点是什么?
我理解其中的差异,但我想知道,这两种情况之间存在细微差异的背后动机是什么?出于所有目的,nil片和空片在使用它们时的行为是相同的。
似乎如果Go开发人员只有一个案例,例如只允许空切片,那么它就简化了心智模型并消除了细微缺陷的来源。
创建这两个用例有什么原因吗?
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如何做到这一点? 问题答案:
问题内容: 我最近学习了Go语言,现在对以下代码感到困惑: 结果: 问题答案: c是从数组中获取的一个切片b。这不是副本,而只是的两个前两个元素的窗口b。 由于b容量为5,c可以扩展到其他3个位置(实际上,它会创建一个新的切片,但位于内存中的同一位置)。 切片的最大容量是底层数组的容量减去切片在数组中起始位置的大小: func main() { b := make([]int, 0, 5) c :
问题内容: 如果我已经在大多数主流浏览器中测试过我的页面,为什么我需要维护一个经过验证的代码?如果WebKit浏览器和Firefox支持框阴影和拐角半径,我想使用它们。我不在乎它们是否不会出现在Internet Explorer中。但是我通过不包含图像来降低HTTP请求的数量。 有效代码是否有优势?在搜索引擎优化还是其他方式? 问题答案: Google更喜欢它,因此对SEO很有好处。 它使您的网页