我从来没有使用过C / C ++,所以我对指针的使用有些困惑。问题是:每个“房间”都有一个class D
{
public static void main( String args[] )
{
B.a = new A();
C.main( args );
}
}
,我想在函数中更改它的片段。在这里:
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
在函数内部正在改变,但是房间的地图没有改变。我应该如何处理删除切片元素的指针?
答案 0 :(得分:0)
这是因为Go中的所有内容都是按值传递的。
这对您而言意味着在地图上进行迭代时,在每次迭代中,val
变量都会被分配对应切片值的 copy 。因此,在循环内重新切片val
值对映射内的原始切片没有影响,因为一个是另一个的副本,而不是对另一个的引用。
要更改地图内的切片,可以将append
操作的结果重新分配给相应的地图键。
r.interactiveItems[i] = append(val[:idxToDelete], val[idxToDelete+1:]...)
请记住,复制切片时,它不会复制切片指向的数据,而只会复制切片的“描述符”。