Обновить объект в памяти значениями из req.Body - PullRequest
0 голосов
/ 27 октября 2018

Я создаю простой сервер в памяти, прежде чем делать что-то с базой данных.У меня есть такой метод обновления:

type Nearby struct {
    ID          int   `json:"id,omitempty"`
    Me          int   `json:"me,omitempty"`
    You         int   `json:"you,omitempty"`
    ContactTime int64 `json:"contactTime,omitempty"`
}

    func (h NearbyHandler) updateById(v NearbyInjection) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
            params := mux.Vars(r)
            decoder := json.NewDecoder(r.Body)
            var t Nearby
            err := decoder.Decode(&t)
            if err != nil {
                panic(err)
            }
            mtx.Lock()
            item, ok := v.Nearby[params["id"]]
            mtx.Unlock()

            if !ok {
                panic(errors.New("No item to update"))
            }

            // !! Ok, how can I overwrite the properties from t onto item

            if ok {
                json.NewEncoder(w).Encode(item)
            } else {
                io.WriteString(w, "null")
            }
        }
    }

Я хочу взять ключ / значения из t и записать их в объект item.t декодируется в структурное значение (я полагаю), а item является структурным значением, найденным на карте.И item, и t имеют один и тот же тип (Nearby)

В JavaScript все, что я хочу сделать, это:

Object.assign(item, t);

Просто пытаюсь сделать что-то похожеес Go.

С Golang я могу сделать это:

    item.ContactTime = t.ContactTime

, но я хочу перезаписать item.ContactTime только если определено t.ContactTime.

Ответы [ 2 ]

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

Я бы предложил использовать https://github.com/imdario/mergo функцию Merge. Я не думаю, что есть какая-либо причина изобретать колесо в этом, и нехватка генериков go не помогает с такими операциями. пример:

src := Foo{
    A: "one",
    B: 2,
}
dest := Foo{
    A: "two",
}
mergo.Merge(&dest, src)
fmt.Println(dest)
// Will print
// {two 2}

Я также думаю, что вы должны сделать указатели всех свойств Nearby, чтобы вы всегда могли сравнить их с nil, чтобы убедиться, что они не были установлены.

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

Просто перезапишите элемент на вашей карте:

v.Nearby[params["id"]] = t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...