如果可能的話,我正在嘗試使我的代碼更具性能,節省內存我做了一些研究,但找不到關于這個具體案例的任何信息。func createSlice() []int { return s[]int{1,2,3}}func main() { s2 := createSlice()}s2 是一個擁有自己底層數組的全新切片,還是指向 s 底層數組的切片?
1 回答

慕田峪9158850
TA貢獻1794條經驗 獲得超8個贊
你必須了解 Go Slices 的 header。那么,你自己就能得到答案。
通過檢查reflect.SliceHeader
類型來查看切片標頭中的內容:
type SliceHeader struct {
? ? Data uintptr
? ? Len? int
? ? Cap? int
}
實際上,切片值是一個header,包含支持數組以及長度和容量。它包含一個指向實際存儲元素的數組的指針。切片值不包含元素(與數組不同)。
因此,當傳遞或返回切片時,將從該標頭傳遞或返回一個副本以及指針。該指針指向同一個支持的數組。因此,如果您修改切片的元素,它也會修改支持的數組,因此所有切片(共享相同的支持數組)也會得到更改。
因此,當您將切片傳遞給函數時,將從該標頭創建一個副本,包括指針,該指針將指向相同的后備數組。修改切片的元素意味著修改后備數組的元素,因此共享相同后備數組的所有切片都將“觀察”更改。
- 1 回答
- 0 關注
- 118 瀏覽
添加回答
舉報
0/150
提交
取消