nums := []int{2, 3, 4}
这是干什么用的?我正在创建一个数组还是一个切片?创建无切片的切片
从此:https://gobyexample.com/range,它说切片。但我认为这是一个数组。
nums := []int{2, 3, 4}
这是干什么用的?我正在创建一个数组还是一个切片?创建无切片的切片
从此:https://gobyexample.com/range,它说切片。但我认为这是一个数组。
在旅途中,阵列类型包括其长度。既然你省略了长度它是一个片:
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
由于您没有指定长度,所以它是一个切片。
数组类型定义指定的长度,并且一个元素类型:请参阅“Go Slices: usage and internals”
切片字面被声明就像数组文本,除非你离开了元件数量。
尽管可以使用名为make的内置函数创建切片,但您使用文字形式创建切片。
内部创建的切片的不同于数组:
make([]byte, 5)
实际上这样做:
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]
数组文本还包括长度,例如:
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