为了账号安全,请及时绑定邮箱和手机立即绑定

在没有 make 的情况下创建 Go 切片

在没有 make 的情况下创建 Go 切片

Go
慕尼黑8549860 2021-09-27 15:44:51
nums := []int{2, 3, 4}这在 go 中有什么作用?我是在创建一个数组还是一个切片?从这个:https://gobyexample.com/range,它说切片。但我认为它是一个数组。
查看完整描述

3 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

实际上通过这样做:


nums := []int{2, 3, 4}

您正在创建两个:一个数组和一个切片。但由于它是一个切片文字,其结果将是片类型的,所以类型nums就是[]int你可以使用此代码验证:


fmt.Printf("%T", nums) // Output: []int

发生的情况是,将在后台自动创建/分配一个长度为 3 的数组,并使用列出的元素进行初始化,并且将创建一个引用该数组的切片,该切片将是表达式的结果。


引用Go 语言规范:复合文字:


切片文字描述了整个底层数组文字。因此,切片文字的长度和容量是最大元素索引加一。切片文字具有以下形式


[]T{x1, x2, … xn}

and 是应用于数组的切片操作的简写:


tmp := [n]T{x1, x2, … xn}

tmp[0 : n]

数组字面量还包括长度,例如:


arr := [3]int{1, 2, 3}

arr2 := [...]int{1, 2, 3} // Length will be computed by the compiler

fmt.Printf("%T", arr)  // Output: [3]int

fmt.Printf("%T", arr2) // Output: [3]int


查看完整回答
反对 回复 2021-09-27
?
青春有我

TA贡献1784条经验 获得超8个赞

由于您没有指定长度,因此它是一个切片。

数组类型定义指定长度和元素类型:请参阅“ Go Slices: usage and internals ”

//img1.sycdn.imooc.com//615176ad00010cf703360063.jpg

切片文字的声明就像数组文字一样,只是您省略了元素计数。

虽然可以使用名为 make 的内置函数创建切片,但您使用文字形式来创建切片。

创建的切片的内部与数组不同:

make([]byte, 5)

//img1.sycdn.imooc.com//615176b400018d2d05100190.jpg

查看完整回答
反对 回复 2021-09-27
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

在 go 中,数组类型包括它们的length。由于您省略了长度,因此它是一个切片:


array := [3]int{1, 2, 3} // Array since it includes length (3).

slice := array[:] // Slice since there is no length specified.


fmt.Printf("%#v - %T\n", slice, slice) // %T means "type".

fmt.Printf("%#v - %T\n", array, array)

// [3]int{1, 2, 3} - [3]int

// []int{1, 2, 3} - []int

在上面的示例中,我们通过将切片设置为array. 如果您要编辑其中一个array或slice两个,那么两者都会改变,因为“切片”本质上是“阵列”存储的视图。


slice[0] = 456 // And array[0] == 456

array[0] = 789 // And slice[0] == 789


查看完整回答
反对 回复 2021-09-27
  • 3 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信