function - 更改函数中的全局 slice

标签 function pointers go slice

我从来没有使用过 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/

相关文章:

php - 具有不同返回值的函数链接?

python - Python 函数应用程序的 Blob 触发器未触发

c - 从指针打印数组,只打印第一个元素

go - 如何使用Google云端硬盘Api和服务帐户获取加星标的文件?

git - 如何在 `go install` -ing 私有(private)包时输入 git repo 用户名?

python - 使用 argparse 调用函数

c++ - 如何使 void* 参数在函数中保存其局部结果,该函数使用 struct * 调用?

c++ - 结构指针数组,出现段错误

string - 在 Go 中将字符串转换为整数类型?

python - 如何遍历不同函数的输出?