创建一个没有 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"。如果您要编辑 array
或 slice
,那么两者都会改变,因为 "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
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"。如果您要编辑 array
或 slice
,那么两者都会改变,因为 "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