Динамическое изменение свойств для значения struct {} Golang, заданного другим - PullRequest
0 голосов
/ 28 октября 2018

У меня есть этот код в обработчике маршрутизатора

    decoder := json.NewDecoder(r.Body)
    var t person.Model
    err := decoder.Decode(&t).          // t is a struct value
    item, ok := v.People[params["id"]]. // ok is a struct value

    if t.Handle != "" {
        item.Handle = t.Handle
    }

    if t.Work != "" {
        item.Work = t.Work
    }

    if t.Image != "" {
        item.Image = t.Image
    }

    if t.Firstname != "" {
        item.Firstname = t.Firstname
    }

    if t.Lastname != "" {
        item.Lastname = t.Lastname
    }

    if t.Email != "" {
        item.Email = t.Email
    }

Но я хотел бы сделать это динамическим, что-то вроде этого:

["Handle", "Work", "Image", "Firstname", "Lastname", "Email"].forEach(v => {
    if t[v] != "" {
        item[v] = t[v]
    }
});

возможно ли это как-то с Голангом?

1 Ответ

0 голосов
/ 28 октября 2018

Для этого используйте пакет отражение :

func setFields(dst, src interface{}, names ...string) {
    d := reflect.ValueOf(dst).Elem()
    s := reflect.ValueOf(src).Elem()
    for _, name := range names {
        df := d.FieldByName(name)
        sf := s.FieldByName(name)
        switch sf.Kind() {
        case reflect.String:
            if v := sf.String(); v != "" {
                df.SetString(v)
            }
            // handle other kinds
        }
    }
}

Вызовите его с указателями на значения:

setFields(&item, &t, "FirstName", "LastName", "Email", "Handle")

Пример игровой площадки

Если вашей реальной целью является перезапись только полей, присутствующих в JSON, то просто сделайте следующее:

item, ok := v.People[params["id"]]. 
decoder := json.NewDecoder(r.Body)
err := decoder.Decode(&item)

Пример игровой площадки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...