我从来没有使用过 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
在函数内部发生变化,但 room 的 map 没有。我应该如何处理删除 slice 元素的指针?
最佳答案
这是因为 Go 中的一切都是按值传递的。
这对您的情况意味着,当您在 map 上迭代时,在每次迭代中,val
变量都会被分配一个相应 slice 值的副本。因此,在循环内重新 slice val
值对映射内的原始 slice 没有影响,因为一个是另一个的副本,而不是对另一个的引用。
要更改 map 内的 slice ,您可以将 append
操作的结果重新分配给相应的 map 键。
r.interactiveItems[i] = append(val[:idxToDelete], val[idxToDelete+1:]...)
请记住,复制 slice 时它不会复制 slice 指向的数据,它只会复制 slice 的“描述符”。
关于function - 更改函数中的全局 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52655356/