Невозможно сохранить значения полей golang, когда они возвращены вызывающей функции - PullRequest
0 голосов
/ 22 мая 2019

У меня есть функция, которая принимает срез значений и полей как набор необязательных параметров, и функция отображает каждое значение в поле и возвращает ошибку, если таковая имеется, вызывающей стороне, как показано ниже

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 ]

2 голосов
/ 22 мая 2019

Что-то не так с кодом выше?

Да. Вы отбрасываете указатели и просто переписываете их новыми значениями. Чтобы установить значение, на которое указывает указатель, вы должны разыменовать его. В вашем случае это может выглядеть примерно так:

for i, s := range source {
    str, ok := dest[i].(*string)
    if ok {
      *str = s.(string)
    }
}
1 голос
/ 22 мая 2019

Этот заботится обо всех типах

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