登录
首页 >  Golang >  Go问答

更改函数中的全局切片

来源:stackoverflow

时间:2024-04-28 17:00:35 494浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《更改函数中的全局切片》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

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


解决方案


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

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

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

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

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

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>