代碼:func main() { a := []int{1, 2} printSlice("a", a) b := a[0:1] printSlice("b origin", b) b = append(b, 9) printSlice("b after append b without growing capacity", b) printSlice("a after append b without growing capacity", a) b = append(b, 5, 7, 8) printSlice("a after append b with grown capacity", a) printSlice("b after append b with grown capacity", b) b[0] = 1000 printSlice("b", b) printSlice("a", a) }func printSlice(s string, x []int) { fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x)}輸出:a len=2 cap=2 [1 2]b origin len=1 cap=2 [1]b after append b without growing capacity len=2 cap=2 [1 9]a after append b without growing capacity len=2 cap=2 [1 9]a after append b with grown capacity len=2 cap=2 [1 9]b after append b with grown capacity len=5 cap=6 [1 9 5 7 8]b len=5 cap=6 [1000 9 5 7 8]a len=2 cap=2 [1 9]有趣的是在最后兩行印刷。我已經(jīng)知道切片只是底層數(shù)組的一個窗口。當在容量內(nèi)重新切片時,兩個切片共享相同的底層數(shù)組,但是當我重新切片以超過其容量時,兩個切片具有不同的底層數(shù)組。但是為什么golang的設(shè)計者選擇不將原始切片的底層數(shù)組改成新切片的底層數(shù)組,從而讓兩個切片仍然擁有相同的底層數(shù)組呢?在當前狀態(tài)下,當我更改新重新切片的某些元素的值時,我必須檢查是否更改了底層數(shù)組以決定此操作是否對它支持的其他切片有副作用(請參閱輸出的最后兩行)。我覺得這很尷尬。
1 回答

慕桂英4014372
TA貢獻1871條經(jīng)驗 獲得超13個贊
但是為什么golang的設(shè)計者選擇不將原始切片的底層數(shù)組改成新切片的底層數(shù)組,從而讓兩個切片仍然擁有相同的底層數(shù)組呢?
主要是,同一個數(shù)組的切片可以出現(xiàn)在程序中的任何地方——完全不同的函數(shù)、包等等??紤]到切片在內(nèi)存中的布局方式,Go 必須“找到”共享數(shù)組的所有切片來更新它們;它沒有辦法。
其他一些數(shù)組列表實現(xiàn)(如 Python 列表)的方法是,您傳遞的實際上是一個指向Go 切片之類的指針,如果兩個變量保存“相同的列表”,則使用一個變量的附加也將顯示當你看著另一個的時候。這也有一些效率成本——另一個指針查找要做a[0]
。在那些你真的需要一個附加在這里作為附加在那里的情況下,你可以使用指向切片的指針。
如果需要,指向切片的指針會為您提供別名,但不提供子切片 - 要獲得您要求的所有內(nèi)容,您需要一種不同的安排,我無法想到野外的示例(偏移量,長度, 和指向struct { capacity int; firstElem *type }
) 的指針。
- 1 回答
- 0 關(guān)注
- 172 瀏覽
添加回答
舉報
0/150
提交
取消