为了账号安全,请及时绑定邮箱和手机立即绑定

更改函数中的全局切片

更改函数中的全局切片

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 关注
  • 67 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信