代码之家  ›  专栏  ›  技术社区  ›  Russiancold

更改函数中的全局切片

  •  0
  • Russiancold  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  0
  •   mkopriva    7 年前

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

    这对于您的案例意味着,当您在映射上迭代时,在每次迭代中 val 变量被指定为 对应的切片值。所以重新切片 循环中的值对映射中的原始切片没有影响,因为其中一个是另一个的副本,而不是对另一个的引用。

    append 对相应的映射键进行操作。

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

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