在范围循环中递增struct var

时间:2018-05-08 22:02:19

标签: variables go reference

这一定是一个菜鸟问题。在从范围循环中获取元素后,我试图在struct / instance(A.a)中增加一个var。看起来我得到了元素的副本,如何在范围循环中引用元素本身?

package main
import "fmt"

type A struct {
  a int
  s string
} 

func main() {
  var es = []A {
     A{
       a:0,
       s:"test",
     },
     A{
       a:1,
       s:"test1",
     },
  }
  for _,e:=range es {
    fmt.Printf("%v\n", e)
    e.a++
  }
  for _,e:=range es {
    fmt.Printf("%v\n", e)
    e.a++
  }
}

输出:

{0 test}
{1 test1}
{0 test}
{1 test1}

期望的输出:

{0 test}
{1 test1}
{1 test}
{2 test1}

提前致谢

1 个答案:

答案 0 :(得分:6)

Go中的所有作业都是副本。使用指针修改原始值:

var es = []*A{
    &A{
        a: 0,
        s: "test",
    },
    &A{
        a: 1,
        s: "test1",
    },
}

https://play.golang.org/p/pz8PwEviMwm

或者,不要复制该值

for i := range es {
    fmt.Printf("%v\n", es[i])
    es[i].a++
}
for i := range es {
    fmt.Printf("%v\n", es[i])
    es[i].a++
}

https://play.golang.org/p/EGl1INcBaTI