2 回答

TA貢獻1827條經驗 獲得超9個贊
這是修復問題中decode顯示的第二個功能的方法。該聲明
dest = reflect.ValueOf(result)
修改局部變量dest,而不是調用者的值。使用以下語句修改調用者的切片:
reflect.ValueOf(dest).Elem().Set(result)
問題中的代碼在 reflect.MakeSlice 中創建的元素之后附加了解碼的元素。結果切片具有len(rows)零值,后跟len(rows)解碼值。通過更改修復
result = reflect.Append(result, reflect.ValueOf(castedModelRow))
至:
result.Index(i).Set(model)
decode這是問題中第二個函數的更新版本:
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貢獻1784條經驗 獲得超8個贊
您與原始解決方案非常接近。在調用附加操作之前,您必須取消引用指針。如果您的 dest 已經有一些現有元素并且您不想通過創建newSlice.
tempDest := reflect.ValueOf(dest).Elem()
tempDest = reflect.Append(tempDest, reflect.ValueOf(model.Interface()))
與@I Love Reflection 指出的類似,您最終需要將新切片設置回指針。
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 關注
- 141 瀏覽
添加回答
舉報