有什么方法可以使用反射设置界面字段?当我尝试设置它时,它惊慌地说该值不可寻址。
type A interface{...} func CreateA(name string) A {...} type B struct { field A should A mirror A } // normal way of initializing var b = B{ field: CreateA("field"), should: CreateA("should"), mirror: CreateA("mirror"), } func MirrorField(b *B) { t := reflect.TypeOf(b) v := reflect.ValueOf(b) for i := 0; i < t.NumField(); i++ { setTo = CreateA(t.Field(1).Name) fieldVal := v.Field(i) fieldVal.Set(reflect.ValueOf(setTo)) } } // what i want is something like var b = &B{} MirrorField(b)
接口没有字段,它们仅定义包含的值的方法集。在界面上进行反射时,可以使用提取值Value.Elem()。
Value.Elem()
您也Set不能取消导出字段。您需要大写您的B类型的字段名称。遍历字段时,用于Value.CanSet()测试它们是否可设置。CanSet()如果该值不可寻址或该值仍在接口中,则也会返回false。
Set
B
Value.CanSet()
CanSet()
您的代码的有效示例:http : //play.golang.org/p/Mf1HENRSny