我從來沒有使用過 C/C++,所以我對 go 中的指針有點困惑。問題是:map[string][]InteractiveItems每個“房間”都有一個,我想在函數中更改它的一部分。這里是:func (r *room) getItem(arg string) InteractiveItem {for i, val := range r.interactiveItems { for _, item := range val { if item.getName() == arg { var idxToDelete int for idx := range val { if val[idx].getName() == arg { idxToDelete = idx break } if len(val) == 0 { delete(r.interactiveItems, i) } } val = append(val[:idxToDelete], val[idxToDelete+1:]...) return item } }}return nil很明顯,val函數內部在變化,而房間的地圖卻沒有。我應該如何處理刪除切片元素的指針?
1 回答

嚕嚕噠
TA貢獻1784條經驗 獲得超7個贊
這是因為 Go 中的一切都是按值傳遞的。
這對您的情況意味著,當您遍歷地圖時,每次迭代val
都會為變量分配相應切片值的副本。因此,在循環內重新切片val
值對地圖內的原始切片沒有影響,因為一個是另一個的副本,而不是對另一個的引用。
要更改地圖內的切片,您可以將操作結果重新分配append
給相應的地圖鍵。
r.interactiveItems[i] = append(val[:idxToDelete], val[idxToDelete+1:]...)
請記住,當復制切片時,它不會復制切片指向的數據,它只會復制切片的“描述符”。
- 1 回答
- 0 關注
- 98 瀏覽
添加回答
舉報
0/150
提交
取消