這是我在Golang第一天,當我嘗試它的切片操作,如append()
,有一兩件事讓我很困惑:爲什麼Golang的切片操作這麼複雜
package main
import "fmt"
func main() {
s := []int{2, 3, 5, 7, 11, 13}
a:= s[2:4];
a = append(a, 1000, 1001);
a[1] = 100;
printSlice("a:", a)
printSlice("s:", s)
}
func printSlice(title string, s []int) {
fmt.Printf("%s len=%d cap=%d %v\n", title, len(s), cap(s), s)
}
當我附上只有兩個數字到a
,如:
a = append(a, 1000, 1001);
...結果是:
a: len=4 cap=4 [5 100 1000 1001]
s: len=6 cap=6 [2 3 5 100 1000 1001]
我認爲,其中的a
顯示爲參考s
。
但是,當我改變的代碼行:
a = append(a, 1000, 1001, 1002);
...結果就變成:
a: len=5 cap=8 [5 100 1000 1001 1002]
s: len=6 cap=6 [2 3 5 7 11 13]
其中,我認爲,a
已重新分配的內存另一段,來保存整個事物,並將對s
的引用分開。
這太不一致了,讓我感到非常困惑,有時候很容易出現這個錯誤(例如當你有一個隨機數的值附加)。
爲什麼Golang是這樣設計的?如果我只是想要像JavaScript的slice
和push
這樣的操作,那怎麼能夠避免呢?
我認爲這個想法是,你只是不'追加到視圖共享數據。如果你想採取子碟並追加它,你可以複製一份。 – user2357112
如果您不理解切片背後的簡單語義,它只會顯得不一致。如果你不確定發生了什麼,你可以閱讀很多資源:[Go Slices:usage and internals](https://blog.golang.org/go-slices-usage-and-internals),[A遊覽之旅:切片](https://tour.golang.org/moretypes/7),[切片類型](https://golang.org/ref/spec#Slice_types)和[附加任何複製切片](https://golang.org/ref/spec#Appending_and_copying_slices),[Go By Example:Slices](https://gobyexample.com/slices)和[Slice Tricks](https://github.com/) golang/go/wiki/SliceTricks) – JimB
@ user2357112謝謝,現在我很清楚。 – Kuan