修改接口数组{} golang

Fur*_*rge 3 go

这种类型的断言,def-referenceing 已经让我发疯了。所以我有一个Key string / Value interface{}成对的嵌套结构。存储在Value[]interface,我想修改每个值。下面是创建一个数组Bar并将其传递到ModifyAndPrint应该修改顶级结构的函数的示例。我遇到的问题是,它实际上并没有修改 z 的内容,我不能做 aq := z.([]interface{})[i].(Bar)&其中的内容。

有没有办法做到这一点?如果是这样,我错过了什么组合?

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)    
}
Run Code Online (Sandbox Code Playgroud)

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

Cer*_*món 6

程序正在修改接口中值的副本{}。{} 实现目标的一种方法是将修改后的值分配回切片:

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)
}
Run Code Online (Sandbox Code Playgroud)

游乐场示例

  • 不,您不能修改接口中的值{}。{} 如果你有一个 []Bar,那么你可以做 z[i].Value = 42。如果把 *Bars 放在切片中,那么你可以做 b := q.(*Bar); b.值 = 42。 (4认同)