2015-01-20 41 views
1

這種類型斷言,def-referencing引起了我的瘋狂。所以我有一個嵌套結構Key string/Value interface{}對。存儲在Value是一個[]interface我想修改每個值。以下是創建一個Bar數組並將其傳遞給ModifyAndPrint函數的示例,該函數應該修改頂層結構。我遇到的問題是寫作它並不實際修改z的內容,我不能做它的q := z.([]interface{})[i].(Bar)&修改接口{} golang的陣列

有沒有辦法做到這一點?如果是這樣,我錯過了什麼組合?

package main 

import "fmt" 

type Bar struct { 
    Name string 
    Value int 
} 

func ModifyAndPrint(z interface{}){ 
    fmt.Printf("z before: %v\n", z) 
    for i, _ := range(z.([]interface{})) {  
     q := z.([]interface{})[i] 
     b := (q).(Bar) 
     b.Value = 42 
     fmt.Printf("Changed to: %v\n", b) 
    } 
    fmt.Printf("z after: %v\n", z) 
} 

func main() {  
    bars := make([]interface{}, 2) 
    bars[0] = Bar{"a",1} 
    bars[1] = Bar{"b",2} 

    ModifyAndPrint(bars)  
} 

https://play.golang.org/p/vh4QXS51tq

+0

http://stackoverflow.com/questions/15945030/change-values-while-iterating-in- golang – akonsu 2015-01-20 20:59:22

+0

我很困惑那個鏈接。這似乎是說使用索引,我正在做。 – FuriousGeorge 2015-01-20 21:14:57

回答

3

該方案是在界面{}修改值的副本。實現你的目標的一種方法是修改後的值分配回片:

for i, _ := range(z.([]interface{})) {  
    q := z.([]interface{})[i] 
    b := (q).(Bar) 
    b.Value = 42 
    z.([]interface{})[i] = b 
    fmt.Printf("Changed to: %v\n", b) 
} 

playground example

+0

這有效,但有沒有更好的方式,不涉及創建一個修改後的元素,並返回?我可以使用原始值嗎? – FuriousGeorge 2015-01-20 21:17:28

+4

不,您無法修改界面中的值{}。如果你有一個[] Bar,那麼你可以做z [i] .Value = 42。如果把* Bars放在切片中,那麼你可以做b:= q。(* Bar); b.Value = 42。 – 2015-01-20 21:21:13