0

我想知道在使用interface{}值时如何使用反射设置变量,并且所有类型的结构都可以传递给func F(o interface{}). 如何将第一个值 (sA) 更改为“你好”?

package main

import (
    "fmt"
    "reflect"
)

type T struct {
    A string
}

func main() {
    F(T{"foo"})
}

func F(o interface{}) {

    t := reflect.ValueOf(&T{"bar"}).Elem()
    s := reflect.ValueOf(&o).Elem()

    // ok
    fmt.Println("struct:   ", t.Field(0).CanSet())

    // panics - how to set s.A?
    fmt.Println("interface:", s.Field(0).CanSet())
}
4

1 回答 1

1

http://play.golang.org/p/F6M5mfMOTY

当您将参考值传递给&oto 时reflect.ValueOf,Go 将解释为Elem()as interface{},而不是您的原始类型。如果您不作为参考传递,您将获得您类型的(不可寻址)实例。我不是 100% 确定为什么会这样,但你肯定可以在上面的播放链接中看到行为。

一种方法是创建一个新的类型的可寻址实例,然后遍历返回的值s以设置新实例中的字段,然后返回它。

于 2014-04-18T16:41:16.870 回答