创建一个没有 make 的 Go slice

Creating a Go slice without make

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

这在 go 中有什么作用?我是在创建数组还是切片?

从这个:https://gobyexample.com/range,它说切片。不过我觉得是数组。

因为你没有指定长度,所以它是一个切片。

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

A slice literal is declared just like an array literal, except you leave out the element count.

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

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

make([]byte, 5)

在 go 中,array 类型包括它们的 length。由于您省略了长度,因此它是 slice:

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"。如果您要编辑 arrayslice,那么两者都会改变,因为 "slice" 本质上是 "array".

存储的视图
slice[0] = 456 // And array[0] == 456
array[0] = 789 // And slice[0] == 789

实际上这样做:

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

您正在创建两者:一个数组一个切片。但是因为它是一个 slice literal,结果将是切片类型,所以 nums 的类型是 []int ,你可以用这个代码来验证:

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

会发生的事情是,一个数组将在后台自动 created/allocated,长度为 3,用列出的元素初始化,并且将创建一个引用该数组的切片,这个切片将是表达式的结果。

引自Go Language Specification: Composite literals

A slice literal describes the entire underlying array literal. Thus, the length and capacity of a slice literal are the maximum element index plus one. A slice literal has the form

[]T{x1, x2, … xn}

and is shorthand for a slice operation applied to an array:

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