Golang 中 `array` 和 `slice{array,array,...}` 有什麼不同?這是很多初學者常問的問題。 php小編子墨為您解答:在Golang中,`array` 是一個固定長度的序列,一旦定義後,長度就無法改變。而 `slice` 則是一個動態長度的序列,可以根據需要進行擴容或縮小。此外,`array` 的長度是在定義時決定的,而 `slice` 的長度可以在執行時動態改變。因此,在使用時,需要根據實際需求選擇合適的資料結構。
我很想知道為什麼,請給我一點提示。
我想將一個陣列附加到res
中,res
是一個二維切片。所以我需要先轉換。
當我將數組轉換為切片時,出現錯誤。
// i need a map to remove duplicates mm := map[[3]int]bool{} mm[[3]int{-1, -1, 2}] = true mm[[3]int{-1, -1, 2}] = true mm[[3]int{-1, 0, 1}] = true var res [][]int for k, _ := range mm { res = append(res, k[:]) } fmt.printf("the res is %v\n", res)
the res is [[-1 0 1] [-1 0 1]]
但是結果不是我想要的。
然後我試探性地修改了一下for迴圈
for k, _ := range mm { //res = append(res, k[:]) res = append(res, []int{k[0], k[1], k[2]}) }
the res is [[-1 0 1] [-1 -1 2]]
現在結果是對的,但是為什麼呢?
k[:]
和 []int{k[0],k[1],k[2]}
有什麼不同?
將循環更改為
for k, _ := range mm { j := k res = append(res, j[:]) }
您的原始循環宣告了一個類型為 [3]int
的變數 k
,該變數在記憶體中具有特定位置。循環的每次迭代,都會將映射 mm
中的不同鍵複製到該變數。到目前為止,一切順利。
當您使用 k[:]
將其轉換為切片時,它會建立一個切片標頭,指向陣列 k
。這裡出錯了 - 循環的下一個迭代,k
的值被覆寫。循環中建立的所有切片都指向記憶體中同一位置的相同支援數組 k
。
透過先將 k
的值複製到在迴圈內宣告的變量,您可以為每個切片提供自己的支援數組,從而避免了該問題。
以上是Golang 中 `array` 和 `slice{array,array,...}` 有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!