2 回答

TA貢獻1839條經(jīng)驗 獲得超15個贊
所以這里有一些事情在起作用。我強烈推薦 goblog 對此的解釋:https ://blog.golang.org/slices (轉(zhuǎn)到標記為容量的部分)。此外,只是一點(微小的)語義,但那些實際上是切片,而不是數(shù)組:)
切入正題,當您第一次聲明切片時,len 為 3,容量為 10。沒問題。但是隨后您重新聲明了 myArray,并將其設(shè)置為 []int{1,2,3}。也沒有問題,這是有效的。
當您希望之前的 len/cap 保持不變時,問題就出現(xiàn)了;您的切片只是指向內(nèi)存中某個空間的指針。所以你現(xiàn)在已經(jīng)改變了你的底層指針(參見 goblog)。切片的容量和長度現(xiàn)在也發(fā)生了變化(默認情況下 - 再次參見 goblog)。如果要添加更多元素,您可以看到 len/cap 的相同變化:
myArray := make([]int, 3, 10)
fmt.Println("len:"len(myArray),", cap:",cap(myArray)) // len: 3 cap: 10
myArray := []int{1, 2, 3}
fmt.Println("len:", len(myArray), "cap:", cap(myArray)) // len: 3 cap: 3
myArray = append(myArray, 4)
fmt.Println("len:", len(myArray), "cap:", cap(myArray)) // len: 4 cap: 8; automatically increases the cap

TA貢獻1871條經(jīng)驗 獲得超8個贊
我相信您會得到這個結(jié)果,因為在第一個示例中您聲明了一個長度為 3 且上限為 10 的切片。但是,在以下語句中,您將一個完全不同的切片分配給該變量。由于您分配的切片是使用“復(fù)合文字”語法聲明/初始化的,并且它只有 3 個項目,這就是它初始化的容量。在第二個示例中,您為使用 make 創(chuàng)建的切片的每個索引分配值,同時保留長度和容量屬性。
嘗試給出更多說明......在 C# 或 Java 或 C++ 中,這就像做這樣的事情;
List<string> myStrings = new List<string>();
myStrings.Add("A string");
myStrings = new List<string>();
正如您可能假設(shè)的那樣,在將新列表分配給 myStrings 變量后,舊列表將丟失。因此,給出簡單的答案,您不僅要覆蓋上限,還要覆蓋整個切片。您在分配中擁有的值會覆蓋它,導(dǎo)致創(chuàng)建一個上限為 3 的切片,這就是您獲得該結(jié)果的原因。
- 2 回答
- 0 關(guān)注
- 155 瀏覽
添加回答
舉報