2 回答

TA貢獻(xiàn)1827條經(jīng)驗 獲得超9個贊
這是修復(fù)問題中decode顯示的第二個功能的方法。該聲明
dest = reflect.ValueOf(result)
修改局部變量dest,而不是調(diào)用者的值。使用以下語句修改調(diào)用者的切片:
reflect.ValueOf(dest).Elem().Set(result)
問題中的代碼在 reflect.MakeSlice 中創(chuàng)建的元素之后附加了解碼的元素。結(jié)果切片具有l(wèi)en(rows)零值,后跟len(rows)解碼值。通過更改修復(fù)
result = reflect.Append(result, reflect.ValueOf(castedModelRow))
至:
result.Index(i).Set(model)
decode這是問題中第二個函數(shù)的更新版本:
func decode(dest interface{}, src string) {
var modelType reflect.Type = getStructType(dest)
rows, fields := getRows(src)
result := reflect.MakeSlice(reflect.SliceOf(modelType), len(rows), len(rows))
for i, row := range rows {
model := reflect.New(modelType).Elem()
for _, field := range fields {
fieldValue := getRowValue(row, field)
model.FieldByName(field).Set(fieldValue)
}
result.Index(i).Set(model)
}
reflect.ValueOf(dest).Elem().Set(result)
}

TA貢獻(xiàn)1784條經(jīng)驗 獲得超8個贊
您與原始解決方案非常接近。在調(diào)用附加操作之前,您必須取消引用指針。如果您的 dest 已經(jīng)有一些現(xiàn)有元素并且您不想通過創(chuàng)建newSlice.
tempDest := reflect.ValueOf(dest).Elem()
tempDest = reflect.Append(tempDest, reflect.ValueOf(model.Interface()))
與@I Love Reflection 指出的類似,您最終需要將新切片設(shè)置回指針。
reflect.ValueOf(dest).Elem().Set(tempDest)
整體解碼:
var modelType reflect.Type = getStructType(dest)
rows, fields := getRows(src)
tempDest := reflect.ValueOf(dest).Elem()
for _, row := range rows {
model := reflect.New(modelType).Elem()
for _, field := range fields {
fieldValue := getRowValue(row, field)
model.FieldByName(field).Set(fieldValue)
}
tempDest = reflect.Append(tempDest, reflect.ValueOf(model.Interface()))
}
reflect.ValueOf(dest).Elem().Set(tempDest)
- 2 回答
- 0 關(guān)注
- 144 瀏覽
添加回答
舉報