答案 0 :(得分:4)
由于您没有指定长度,因此它是一个切片。
数组类型定义指定长度和元素类型:请参阅" Go Slices: usage and internals"
切片文字声明就像数组文字一样,除了省略元素数。
虽然可以使用名为make的内置函数创建切片,但您使用文字形式创建切片。
创建的切片的内部与数组不同:
make([]byte, 5)
答案 1 :(得分:4)
实际上这样做:
nums := []int{2, 3, 4}
您正在创建两者:数组和切片。但由于它是slice literal,因此结果将是切片类型,因此nums
的类型为[]int
,您可以使用此代码进行验证:
fmt.Printf("%T", nums) // Output: []int
将会在后台自动创建/分配一个数组,其长度为3,并使用列出的元素进行初始化,并且将创建一个参考数组的切片,此切片将是表达式的结果
引用Go Language Specification: Composite literals:
切片文字描述整个基础数组文字。因此,切片文字的长度和容量是最大元素索引加1。切片文字的格式为
[]T{x1, x2, … xn}
是应用于数组的切片操作的简写:
tmp := [n]T{x1, x2, … xn} tmp[0 : n]
Array文字还包括长度,例如:
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
答案 2 :(得分:3)
在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
的整个范围来创建切片而不调用“make”。如果您要编辑array
或slice
,则两者都会更改,因为“slice”实际上是存储为“数组”的视图。
slice[0] = 456 // And array[0] == 456
array[0] = 789 // And slice[0] == 789