Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 返回给函数调用方时,无法保留golang字段的值_Pointers_Go_Slice - Fatal编程技术网

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这是个问题。有更好的主意吗?如果有太多的类型而无法实际使用类型开关,则需要应用反射。