【发布时间】:2019-02-06 23:58:27
【问题描述】:
我一直在努力使用反射包。下面的代码符合我的预期:
package main
import (
"reflect"
"log"
)
type Car struct {
Model string
}
type Person struct {
Name string
Cars []Car
}
func ModifyIt(parent interface{},fieldName string, val interface{}) {
slice := reflect.ValueOf(parent).Elem()
nth := slice.Index(0)
//row := nth.Interface() // this line causes errors
row := nth.Interface().(Person)
elem := reflect.ValueOf(&row).Elem()
field := elem.FieldByName(fieldName)
log.Println(field.CanSet())
}
func main() {
p := []Person{Person{Name:"john"}}
c := []Car{Car{"corolla"},Car{"jetta"}}
ModifyIt(&p,"Cars",&c)
}
但是,如果我将行 row := nth.Interface().(Person) 替换为 row := nth.Interface(),即删除类型断言,则会收到错误:
panic: reflect: 在接口 Value 上调用 reflect.Value.FieldByName 在线“字段:= elem.FieldByName(fieldName)
在过去的几个小时里,我尝试了很多其他的事情,比如尝试对其他一些变量进行reflect.TypeOf()、reflect.Indirect() 等...但没有成功。
我读过一些其他类似的问题:
reflect: call of reflect.Value.FieldByName on ptr Value
Set a struct field with field type of a interface
Golang reflection: Can't set fields of interface wrapping a struct
他们似乎表明我对指针或接口的工作方式没有很好的理解。
所以我的问题是,当结构被键入为接口时,我该如何设置结构的字段?
更新
我发布了一个解决方案作为答案,但我对它是否是正确或安全的做事方式没有信心。我希望有人能解释一下,或者发布一个更好的解决方案。
【问题讨论】:
标签: go go-reflect