亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 中的函數返回一個新切片還是指向第一個切片的底層數組的切片?

Go 中的函數返回一個新切片還是指向第一個切片的底層數組的切片?

Go
哆啦的時光機 2023-07-10 16:36:54
如果可能的話,我正在嘗試使我的代碼更具性能,節省內存我做了一些研究,但找不到關于這個具體案例的任何信息。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,包含支持數組以及長度和容量。它包含一個指向實際存儲元素的數組的指針。切片值不包含元素(與數組不同)。


因此,當傳遞或返回切片時,將從該標頭傳遞或返回一個副本以及指針。該指針指向同一個支持的數組。因此,如果您修改切片的元素,它也會修改支持的數組,因此所有切片(共享相同的支持數組)也會得到更改。


因此,當您將切片傳遞給函數時,將從該標頭創建一個副本,包括指針,該指針將指向相同的后備數組。修改切片的元素意味著修改后備數組的元素,因此共享相同后備數組的所有切片都將“觀察”更改。


查看完整回答
反對 回復 2023-07-10
  • 1 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號