2015-01-20 76 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