3 回答
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
TA贡献1784条经验 获得超8个赞
由于您没有指定长度,因此它是一个切片。
数组类型定义指定长度和元素类型:请参阅“ Go Slices: usage and internals ”
切片文字的声明就像数组文字一样,只是您省略了元素计数。
虽然可以使用名为 make 的内置函数创建切片,但您使用文字形式来创建切片。
创建的切片的内部与数组不同:
make([]byte, 5)
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
- 3 回答
- 0 关注
- 193 浏览
添加回答
举报