Я прочитал несколько примеров / вопросов об отражении в Go, но я все еще не могу понять, что я должен делать со своим списком интерфейсов.
Ниже приведена урезанная версия реального варианта использования.
У меня есть несколько типов, соответствующих данному интерфейсу:
type Foo interface {
Value() int
}
type bar struct {
value int
}
func (b bar) Value() int {
return b.value
}
type baz struct{}
func (b baz) Value() int {
return 42
}
У меня есть список таких парней
type Foos []Foo
var foos = Foos{
bar{},
baz{},
}
и я хотел бы просмотреть этот список, изменив значение членов, имеющих поле value
.
for k := range foos {
change(&foos[k])
}
Но я не могу найти правильный путь
func change(g *Foo) {
t := reflect.TypeOf(g).Elem()
fmt.Printf("t: Kind %v, %#v\n", t.Kind(), t)
v := reflect.ValueOf(g).Elem()
fmt.Printf("v: Kind %v, %#v, %v\n", v.Kind(), v, v.CanAddr())
if f, ok := t.FieldByName("value"); ok {
fmt.Printf("f: %#v, OK: %v\n", f, ok)
vf := v.FieldByName("value")
fmt.Printf("vf: %#v: %v\n", vf, vf.CanAddr())
vf.SetInt(51)
}
}
Как видите, я не уверен, как склеить биты TypeOf и ValueOf ...
Полный пример на Go Playground .