2015-03-31 146 views

回答

3

在旅途中,阵列类型包括其长度。既然你省略了长度它是一个

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。如果您要编辑arrayslice,那么两者都会改变,因为“切片”本质上是对“阵列”存储的视图。

slice[0] = 456 // And array[0] == 456 
array[0] = 789 // And slice[0] == 789 
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

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] 

数组文本还包括长度,例如:

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