范围引用而不是值

时间:2013-11-25 05:39:35

标签: pointers reference go

我看到该范围返回密钥和" copy"的价值。该范围是否有办法返回该项目的地址?实施例

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for _, e := range array {
        e.field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

http://play.golang.org/p/AFOGG9NGpx

这里"字段"未修改,因为范围发送字段的副本, 我是否必须使用索引或是否有其他方法来修改值?

感谢阅读。

5 个答案:

答案 0 :(得分:81)

简短&直接回答:不,使用数组索引而不是值

所以上面的代码变成了:

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for idx, _ := range array {
        array[idx].field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

答案 1 :(得分:2)

合并@Dave C@Sam Toliman的评论

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for idx := range array {
        e := &array[idx]
        e.field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

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

答案 2 :(得分:0)

已经在评论中说过了,但是对于那些立即寻找答案的人来说,这是通过使用一片指针并通过对原始代码进行最少更改来实现预期结果的方法。

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    // Slice of pointers instead of slice of type
    var array [10]*MyType

    // Initialize array manually
    for idx := range array {
        array[idx] = &MyType{}
    }

    for _, e := range array {
        e.field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }

}

这里是playground

答案 3 :(得分:0)

Go 的 &range 只支持按值赋值。没有for i := range array { e := &array[i] e.field = "foo" } ,因为它解决的问题太琐碎。

可以达到如下效果:

awk

答案 4 :(得分:-1)

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for index := range array {
        array[index].field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}