创建没有make的Go切片

时间:2015-03-31 05:44:42

标签: arrays go slice

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

这是做什么的?我在创建数组还是切片?

从这个:https://gobyexample.com/range,它说切片。但我认为这是一个数组。

3 个答案:

答案 0 :(得分:4)

由于您没有指定长度,因此它是一个切片。

数组类型定义指定长度和元素类型:请参阅" Go Slices: usage and internals"

http://blog.golang.org/go-slices-usage-and-internals_slice-array.png

  

切片文字声明就像数组文字一样,除了省略元素数。

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

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

make([]byte, 5)

http://blog.golang.org/go-slices-usage-and-internals_slice-1.png

答案 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”。如果您要编辑arrayslice,则两者都会更改,因为“slice”实际上是存储为“数组”的视图。

slice[0] = 456 // And array[0] == 456
array[0] = 789 // And slice[0] == 789