我从来没有使用过 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 关注
- 67 浏览
添加回答
举报
0/150
提交
取消