为了账号安全,请及时绑定邮箱和手机立即绑定

返回给函数的调用者时无法保留 golang 字段的值

返回给函数的调用者时无法保留 golang 字段的值

Go
芜湖不芜 2023-06-19 15:53:15
我有一个函数,它接受值和字段的切片作为一组可选参数,并且该函数将每个值映射到一个字段并返回错误(如果有的话)给调用者,如下所示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)

    }

}


查看完整回答
反对 回复 2023-06-19
?
慕尼黑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)

        }

    }


查看完整回答
反对 回复 2023-06-19
  • 2 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信