Pointers 返回给函数调用方时,无法保留golang字段的值
我有一个函数,它接受一部分值和字段作为一组可选参数,该函数将每个值映射到一个字段,并向调用者返回错误(如果有),如下所示Pointers 返回给函数调用方时,无法保留golang字段的值,pointers,go,slice,Pointers,Go,Slice,我有一个函数,它接受一部分值和字段作为一组可选参数,该函数将每个值映射到一个字段,并向调用者返回错误(如果有),如下所示 func Unmarshall(source []interface{}, dest ...interface{}) error { if len(source) != len(dest) { return errors.New("source and destination doesn't match") } for i, s :=
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 funct
中设置的值,即使我传入了指向字段的指针
上述代码有什么问题吗?
上面的代码有什么问题吗
对。您正在丢弃指针,而只是用新值覆盖它们。若要设置指针指向的值,必须取消对它的引用。在您的案例中可能会出现如下情况:
for i, s := range source {
str, ok := dest[i].(*string)
if ok {
*str = s.(string)
}
}
这个可以照顾所有类型的人
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)
}
}
看起来不错,但字段可能并非始终是字符串,例如,我的值中有int64,无法转换为字符串。您是否建议使用反射来执行此操作?@doi无需引入反射,简单类型就足够了。如果有大量可能的类型需要处理,则简单类型开关就不够了。@Adrian这是个问题。有更好的主意吗?如果有太多的类型而无法实际使用类型开关,则需要应用反射。