我一直在为反射包而苦苦挣扎。下面的代码符合我的预期:
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(),即删除类型断言,则会收到错误:
恐慌:反映:在接口值上调用 reflect.Value.FieldByName on line "field := elem.FieldByName(fieldName)
在过去的几个小时里,我尝试了很多其他的事情,比如尝试reflect.TypeOf()对reflect.Indirect()其他一些变量做等等,但没有成功。
我的问题是,当结构被键入为接口时,我该如何设置结构的字段?
HUWWW
暮色呼如
相关分类