[pointers] 값 대신 범위 참조

범위가 키와 값의 “복사본”을 반환하는 것을 보았습니다. 해당 범위에서 항목의 주소를 반환하는 방법이 있습니까? 예

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

여기서 “필드”는 범위가 필드의 복사본을 보내기 때문에 수정되지 않습니다. 인덱스를 사용해야합니까 아니면 값을 수정하는 다른 방법이 있습니까?

읽어 주셔서 감사합니다.



답변

짧고 직접적인 대답 : 아니요, 값 대신 배열 인덱스를 사용하십시오.

따라서 위의 코드는 다음과 같습니다.

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("--")
    }
}


답변

이미 주석에서 언급되었지만 즉시 답변을 찾는 사람들을 위해 포인터 조각을 사용하고 원본 코드를 최소한으로 변경하여 예상되는 결과를 얻을 수있는 방법은 다음과 같습니다.

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("--")
    }

}

여기는 놀이터입니다


답변

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("--")
    }
}


답변