在函数中更改全局切片

时间:2018-10-04 21:23:55

标签: function pointers go slice

我从来没有使用过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 在函数内部正在改变,但是房间的地图没有改变。我应该如何处理删除切片元素的指针?

1 个答案:

答案 0 :(得分:0)

这是因为Go中的所有内容都是按值传递的。

这对您而言意味着在地图上进行迭代时,在每次迭代中,val变量都会被分配对应切片值的 copy 。因此,在循环内重新切片val值对映射内的原始切片没有影响,因为一个是另一个的副本,而不是对另一个的引用。

要更改地图内的切片,可以将append操作的结果重新分配给相应的地图键。

r.interactiveItems[i] = append(val[:idxToDelete], val[idxToDelete+1:]...)

请记住,复制切片时,它不会复制切片指向的数据,而只会复制切片的“描述符”。