nums := []int{2, 3, 4}
這是幹什麼用的?我正在創建一個數組還是一個切片?創建無切片的切片
從此:https://gobyexample.com/range,它說切片。但我認爲這是一個數組。
nums := []int{2, 3, 4}
這是幹什麼用的?我正在創建一個數組還是一個切片?創建無切片的切片
從此:https://gobyexample.com/range,它說切片。但我認爲這是一個數組。
在旅途中,陣列類型包括其長度。既然你省略了長度它是一個片:
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
。如果您要編輯array
或slice
,那麼兩者都會改變,因爲「切片」本質上是對「陣列」存儲的視圖。
slice[0] = 456 // And array[0] == 456
array[0] = 789 // And slice[0] == 789
由於您沒有指定長度,所以它是一個切片。
數組類型定義指定的長度,並且一個元素類型:請參閱「Go Slices: usage and internals」
切片字面被聲明就像數組文本,除非你離開了元件數量。
儘管可以使用名爲make的內置函數創建切片,但您使用文字形式創建切片。
內部創建的切片的不同於數組:
make([]byte, 5)
實際上這樣做:
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