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

初始化空切片的正确方法

冷吉星
2023-03-14

要声明大小不固定的空切片,最好执行以下操作:

mySlice1 := make([]int, 0)

或:

mySlice2 := []int{}

只是想知道哪一个是正确的方法。

共有3个答案

商正浩
2023-03-14

作为@ANisus回答的补充...

以下是《行动起来》一书中的一些信息,我认为值得一提:

如果我们想到这样一个切片:

[pointer] [length] [capacity]

然后:

nil slice:   [nil][0][0]
empty slice: [addr][0][0] // points to an address

当您想要表示不存在的切片时,例如当返回切片的函数中发生异常时,它们非常有用。

// Create a nil slice of integers.
var slice []int

当您希望表示空集合时(例如当数据库查询返回零结果时),空切片非常有用。

// Use make to create an empty slice of integers.
slice := make([]int, 0)

// Use a slice literal to create an empty slice of integers.
slice := []int{}

无论您使用的是nil片还是空片,内置函数appendlencap的工作原理都是一样的。

Go游乐场示例:

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
顾乐心
2023-03-14

它们是等价的。请参阅此代码

mySlice1 := make([]int, 0)
mySlice2 := []int{}
fmt.Println("mySlice1", cap(mySlice1))
fmt.Println("mySlice2", cap(mySlice2))

输出:

mySlice1 0
mySlice2 0

两个切片都有0容量,这意味着两个切片都有0长度(不能大于容量),这意味着两个切片都没有元素。这意味着这两个切片在各个方面都是相同的。

参见类似问题:

Go语言中的零切片和空切片有什么意义?

Go语言中的空切片与非空切片

拓拔泓
2023-03-14

您给出的两个选项在语义上是相同的,但是使用make([]int,0)将导致对runtime.makeslice的内部调用(Go 1.16)。

您还可以选择将其保留为nil值:

var myslice []int

如《戈朗》所写。组织博客:

零切片在功能上等同于零长度切片,即使它指向任何内容。它的长度为零,可以附加到分配。

然而,一个nil片段将json。正如@farwayer所指出的,封送()“null”,而空片将封送到“[]”

正如@Armanodookhani所指出的,上述选项都不会导致任何分配。

 类似资料:
  • 问题内容: 要声明一个具有固定大小的空切片,最好这样做: 要么: 只想知道哪种方法是正确的。 问题答案: 您提供的两个选择在语义上是相同的,但是使用会导致内部调用 runtime.makeslice (Go 1.14)。 您还可以选择保留其值: 如Golang.org博客中所述: nil切片在功能上等效于零长度切片,即使它没有指向任何内容。它的长度为零,可以附加分配。 甲片段将然而入而空片将编组成

  • 问题内容: 用RefluxJS异步初始化数据的正确方法是什么?是否有类似于AngularJS的解决方案,或者Flux的实现与此无关(路由器应该处理此职责)? 问题答案: 在应用程序的顶级组件中,使用方法(docs)触发获取数据的操作。最初渲染组件时将调用此方法。 例如:

  • 问题内容: 我正在设置用于学习JavaEE7中CDI的基本环境。我有以下代码可以启动。只是启动和关闭。 我正在控制台上关注。 有问题的线是。这仅表示依赖注入将不起作用。但是我不确定是什么问题。我已经添加了。我什至没有达到初始化对象的目的,那为什么会出现这个问题呢? Weld的官方文档还给出了阅读此答案后得到的相同代码。“ Antonio Goncalves”撰写的“ Beginning Java

  • 问题内容: 将log4j添加到我的应用程序后,每次执行我的应用程序时,都会得到以下输出: 看来这意味着缺少配置文件。此配置文件应位于何处,什么是良好的入门内容? 我使用纯Java开发桌面应用程序。因此没有网络服务器等… 问题答案: 默认情况下,在上查找名为或的文件。 您可以按照此处所述通过设置系统属性来控制它用来初始化自身的文件(查找“默认初始化过程”部分)。 例如: 将导致在类路径上查找名为的文

  • 我们的项目中有一个不可替代代币状态和不可替代代币合约的自定义实现。我们正在使用下面的代码来发行我们的自定义不可替代代币。 当试图将上面获得的事务构建器转换为有线事务时(< code > builder . towiretransaction(service hub);)我们在下面的堆栈跟踪中得到一个错误。

  • 我有以下代码: 以及: 我得到以下错误: 以及更早的错误: 如果我将代码修改为: 然后,我不再得到关于项目关系存在的错误,但是,似乎事务被完全取消了? 我得到以下输出: 所以我的问题是 > 正确的方法是什么? 为什么我的CommandLineRunner代码似乎执行了两次?该表在运行代码后不会持久化,因此它似乎必须执行两次才能获得关于现有表的第一个错误。 谢谢你。