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

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

更改函數中的全局切片

更改函數中的全局切片

Go
泛舟湖上清波郎朗 2023-04-17 16:21:36
我從來沒有使用過 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:]...)

請記住,當復制切片時,它不會復制切片指向的數據,它只會復制切片的“描述符”。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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