2015-03-31 227 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