2 回答
TA贡献1111条经验 获得超0个赞
试试这个:
func setExistingFields(src interface{}, dst interface{}) {
srcFields := reflect.TypeOf(src).Elem()
srcValues := reflect.ValueOf(src).Elem()
dstValues := reflect.ValueOf(dst).Elem()
for i := 0; i < srcFields.NumField(); i++ {
srcField := srcFields.Field(i)
srcValue := srcValues.Field(i)
dstValue := dstValues.FieldByName(srcField.Name)
if dstValue.IsValid() {
if dstValue.CanSet() {
dstValue.Set(srcValue)
}
}
}
}
请注意,您需要额外检查src字段值是否可分配给dst字段类型。
编辑:您收到该错误的原因是因为fields此时是指向结构的指针。您需要使用Elem().
TA贡献1898条经验 获得超8个赞
这是行不通的:一个结构总是在编译时获得它的“模式”(例如它的字段)......你不能在运行时添加更多字段。
我没有看到你的确切用例是什么,但考虑类似map[string]string
甚至map[string]interface{}
能够“扩展”你传递的东西的内容/字段......
- 2 回答
- 0 关注
- 132 浏览
添加回答
举报