我有一个函数,它接受值和字段的切片作为一组可选参数,并且该函数将每个值映射到一个字段并返回错误(如果有的话)给调用者,如下所示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不会保留中设置的值。Unmarshall func上面的代码有什么问题吗?
2 回答
温温酱
TA贡献1752条经验 获得超4个赞
上面的代码有什么问题吗?
是的。您正在丢弃指针,只是用新值覆盖它们。要设置指针指向的值,您必须取消引用它。在您的情况下可能看起来像这样:
for i, s := range source {
str, ok := dest[i].(*string)
if ok {
*str = s.(string)
}
}
慕尼黑8549860
TA贡献1818条经验 获得超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 关注
- 125 浏览
添加回答
举报
0/150
提交
取消