値の代わりに範囲参照


91

範囲がキーと値の「コピー」を返すことを確認しました。その範囲でアイテムの住所を返す方法はありますか?例

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 2017

回答:


126

短くて直接的な答え:いいえ、値の代わりに配列インデックスを使用してください

したがって、上記のコードは次のようになります。

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.field1e.field2などより密接OPは(だけではなく、1の2行)と思っているかもしれない似ているが。
デイブC

18
あなたは、ドロップすることができます, _-完全for idx := range array
サム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("--")
    }
}

1
これは、既存の受け入れられた回答(6年前に投稿された)に何も追加しないようです。
英国人
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.