값 대신 범위 참조


90

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

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

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

읽어 주셔서 감사합니다.



1
포인터 배열을 사용할 수 있습니까 MyType?
nvcnvn 2013

예, 포인터 배열을 사용하는 경우 인덱스를 사용하지 않고도 배열에서 직접 결과를 수정할 수 있습니다. 여기에 예제가 있습니다. play.golang.org/p/_Vx7ONLDJs
notzippy

range잘 작동하고 슬라이스 안에 넣은 것을 반환합니다. 여기서 유형 값 MyStruct(값 유형)은 슬라이스 내부에 있습니다. 대신 *MyStruct슬라이스 안에 타입의 포인터를 넣을 수 있습니다. 있는 그대로 작동하는 데 절대적으로 필요한 경우에서 반환하는 값 대신 인덱스를 사용할 수 있습니다 range.
Kaveh Shahbazian

답변:


123

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

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

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

30
물론, 당신이 반복적으로 액세스하는 경우 array[idx]대신하도록 선택할 수있는 e := &array[idx]for 루프의 상단에 다음 사용 e.field1, e.field2등 더 자세히 영업 이익은 (단지 하나가 아닌 두 개의 라인) 원 수도 닮았을.
Dave C

16
, _완전히 드롭 할 수 있습니다for idx := range array
Sam Toliman

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

}

여기는 놀이터입니다


2
사실 그 포인터는이 범위 사용에만 유용합니다. e := &array[idx]포인터에 대한 포인터가있는 모든 범위 안에 추가하는 것이 좋습니다 .
Cirelli94

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

이것은 기존의 수락 된 답변에 아무것도 추가하지 않는 것 같습니다 (6 년 전에 게시 됨).
Brits
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.