2 回答

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超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字段類型。
編輯:您收到該錯誤的原因是因?yàn)閒ields此時是指向結(jié)構(gòu)的指針。您需要使用Elem().

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個贊
這是行不通的:一個結(jié)構(gòu)總是在編譯時獲得它的“模式”(例如它的字段)......你不能在運(yùn)行時添加更多字段。
我沒有看到你的確切用例是什么,但考慮類似map[string]string
甚至map[string]interface{}
能夠“擴(kuò)展”你傳遞的東西的內(nèi)容/字段......
- 2 回答
- 0 關(guān)注
- 179 瀏覽
添加回答
舉報