登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-08 13:09:37 225浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《返回到函数调用者时无法保留 golang 字段的值》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

我有一个函数,它接受值和字段的切片作为一组可选参数,并且该函数将每个值映射到一个字段,并向调用者返回错误(如果有),如下所示

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 中设置的值,即使我将指针传递给字段也是如此。

上面的代码有什么问题吗?


解决方案


这个可以处理所有类型

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)
        }
    }

是的。您将丢弃指针并简单地用新值覆盖它们。要设置指针指向的值,必须取消引用它。在您的情况下可能看起来像这样:

for i, s := range source {
    str, ok := dest[i].(*string)
    if ok {
      *str = s.(string)
    }
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>