【问题标题】:changing global slice in a function更改函数中的全局切片
【发布时间】:2019-03-10 08:32:03
【问题描述】:

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

【问题讨论】:

  • 将追加的结果设置到要在地图内更改的切片,即。 r.interactiveItems[i] = append(val[:idxToDelete], val[idxToDelete+1:]...).
  • @mkopriva 谢谢!写一个答案,我标记一下

标签: function pointers go slice


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多