2013-11-25 14 views
28

Bu aralığın anahtarı ve değerin "kopyasını" döndürdüğünü gördüm. Bu aralığın, öğenin adresini iade etmesinin bir yolu var mı? Örnekgolang aralığı başvurular yerine

İşte
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

"alanı" mesafesi alan kopyasını gönderdiği için, modifiye Ben endeksi kullanmak zorunda veya değeri değiştirmek için başka bir yolu yoktur mı değil mi?

Okumak için teşekkürler.

+4

olası yinelenen [Değiştir değerlerine golang içinde yineleme sırasında] (http://stackoverflow.com/questions/15945030/change-values-while-iterating-in-golang) –

+0

'MyType' işaretçisi dizisini kullanabilir misiniz? – nvcnvn

+0

Evet, bir dizi işaretçiyi kullanırsanız, dizini kullanmak zorunda kalmadan sonuçları doğrudan dizide değiştirebilirsiniz, burada bir örnek var http://play.golang.org/p/_Vx7ONLDJs – notzippy

cevap

43

kısa & doğrudan cevap: hayır, değeri

yerine dizi dizinini kullanmak Yani yukarıdaki kod olur:

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

Ve elbette, eğer dizi [idx] 'e tekrar tekrar erişirseniz, bunun yerine for döngüsünün üst kısmında' e: = & array [idx] 'seçeneğini seçebilir ve daha sonra' e.field1', 'e.field2’yi kullanabilirsiniz. OP'ye daha yakından benzeyen, vb. istemiş olabilir (sadece bir satır yerine iki satır). –