go - 如何从函数返回 slice 的更改值?

标签 go slice

<分区>

我是新来的,如果这是一个微不足道的问题,请原谅我。我想遍历一片帖子并增加每个帖子的 Views 的值:

    func incrementViews(posts []model.Post) []model.Post {
        for _, v := range posts { 
            v.Views++
            fmt.Println(v.Views) //Views incremented by 1
        }
        return posts
    }

    incrementViews(posts) //Views not changed

打印值已更改,但当我调用 incrementViews(posts) 时,返回值未更改。

我试图通过使用 &* 来解决这个问题,但没能成功,这可能是因为我来自 Python 背景并且已经失去了通过以下方式移动变量的把握指针和值。

最佳答案

问题中的代码正在更新局部变量v。将 slice 更改为 *model.Post 或使用索引运算符更新 slice 中的值。前者需要对调用者进行更改。

func incrementViews(posts []*model.Post) []*model.Post {
    for _, v := range posts { 
        v.Views++
    }
    return posts
}

func incrementViews(posts []model.Post) []model.Post {
    for i := range posts { 
        posts[i].Views++
    }
    return posts
}

编辑:

这两种方法都有效,请参见此处:https://play.golang.org/p/90BNOFYaKL

关于go - 如何从函数返回 slice 的更改值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45093908/

相关文章:

arrays - 什么是二维数组内存表示法?

go - 在Go中解码配置文件

python - Scala中的切片符号?

loops - 从 Golang 中的 slice 中删除

dictionary - 在参数中使用的 slice vs map

CSS 放置示例(标题、图像、文本和阅读更多链接)

go - Go本地包中的未定义函数

pointers - 当我将变量传递给 golang 中的私有(private)方法时,它会创建一个新实例吗?

go - 从 slice 中移除接口(interface)项

go - SQLite3错误: database is locked in golang