2013-11-25 26 views
28

我看到該範圍返回鍵和該值的「副本」。有一種方法可以返回該項目的地址嗎?例如golang範圍引用代替值

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

這裏的「場」沒有修改,因爲範圍發送場的副本, 我一定要使用索引或是否有任何其他的方式來修改這個值?

感謝您的閱讀。

+4

的可能重複的[更改值,同時在golang迭代]( http://stackoverflow.com/questions/15945030/change-values-while-iterating-in-golang) –

+0

你可以使用MyType的指針數組嗎? – nvcnvn

+0

是的,如果你用一個指針數組,你可以直接修改結果陣列中,而不必使用索引,這裏有個例子http://play.golang.org/p/_Vx7ONLDJs – notzippy

回答

43

短&直接回答:沒有,使用數組索引代替值

的所以上面的代碼變爲:

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

當然,如果您反覆訪問'array [idx]',您可以選擇在for循環的頂部使用'e:=&array [idx]',然後使用'e.field1','e.field2 '等等,這些更類似於OP可能想要的(只有兩行而不是一行)。 –