我有一個函數(shù),它接受值和字段的切片作為一組可選參數(shù),并且該函數(shù)將每個值映射到一個字段并返回錯誤(如果有的話)給調(diào)用者,如下所示func Unmarshall(source []interface{}, dest ...interface{}) error { if len(source) != len(dest) { return errors.New("source and destination doesn't match") } for i, s := range source { dest[i] = s } return nil}在我為來電者提供的代碼下方for _, r := range rows.Values { item := entity.Item{} e :=Unmarshall(r, &item.Name, &item.Description, &item.AddedUTCDatetime, &item.ModifiedUTCDatetime) if e == nil { items = append(items, item) } }但是上面的問題是即使我傳入了指向字段的指針,也item.Name,item.Description, &item.AddedUTCDatetime, &item.ModifiedUTCDatetime不會保留中設(shè)置的值。Unmarshall func上面的代碼有什么問題嗎?
2 回答

溫溫醬
TA貢獻(xiàn)1752條經(jīng)驗 獲得超4個贊
上面的代碼有什么問題嗎?
是的。您正在丟棄指針,只是用新值覆蓋它們。要設(shè)置指針指向的值,您必須取消引用它。在您的情況下可能看起來像這樣:
for i, s := range source {
str, ok := dest[i].(*string)
if ok {
*str = s.(string)
}
}

慕尼黑8549860
TA貢獻(xiàn)1818條經(jīng)驗 獲得超11個贊
這個照顧所有類型
for i, s := range source {
so := reflect.ValueOf(s)
if !reflect.DeepEqual(so, reflect.Zero(reflect.TypeOf(so)).Interface()) {
reflect.ValueOf(dest[i]).Elem().Set(so)
}
}
- 2 回答
- 0 關(guān)注
- 155 瀏覽
添加回答
舉報
0/150
提交
取消