猿问

使用指针修改切片元素

我目前正在尝试通过将指针传递给函数来修改切片的元素。在函数外部,元素不会被修改。


有没有办法在不传递切片本身以及要更改的所需元素的索引的情况下修改元素?


package main


import (

    "fmt"

)


type Item struct {

    Value int

}


func alter(t *Item) {

    (*t).Value = 100

}


func main() {


    items := []Item{Item{0}, Item{1}}


    for _, item := range items {

        alter(&item)

    }


    fmt.Println(items) // Output is still [{0} {1}]


}

高浪游乐场


慕森卡
浏览 111回答 2
2回答

HUX布斯

for i := range items {    alter(&items[i])}或items := []*Item{{0}, {1}}for _, item := range items {    alter(item)}您的版本不起作用的原因是,迭代变量在切片中保存元素的副本,这意味着您正在修改的是副本而不是原始副本。如果您运行以下命令,您可以看到它们是内存中的独立对象:https://play.golang.org/p/vr9CfX0WQcBitem

翻阅古今

参考:https://tour.golang.org/moretypes/16for 循环的范围形式在切片或映射上迭代。在切片上划过范围时,每次迭代都会返回两个值。第一个是索引,第二个是该索引处元素的副本。所以for i, x := range arr {    // x is copy for arr[i]}因此,我们将直接使用相同的地址并将其传递给函数,以便可以对其进行修改。arr[i]alter示例代码:package mainimport "fmt"type Item struct {    Value int}func alter(t *Item) {    (*t).Value = 100}func main() {    items := []Item{{0}, {1}}    for i := range items {        alter(&items[i])    }    fmt.Println(items)}
随时随地看视频慕课网APP

相关分类

Go
我要回答