使用req中的值更新内存中的对象.body



在使用数据库之前,我正在创建一个简单的内存服务器。我有这个更新方法:

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是在映射中找到的一个结构的值。itemt具有相同类型(Nearby(

在JavaScript中,我想做的就是:

Object.assign(item, t);

只是想用Go完成一些类似的事情。

有了Golang,我可以做到:

item.ContactTime = t.ContactTime

但我只想在定义了CCD_ 6的情况下覆盖CCD_。

只需覆盖地图中的项目:

v.Nearby[params["id"]] = t

我建议使用https://github.com/imdario/mergo函数CCD_ 7。我认为没有任何理由在这一点上重新发明轮子,go缺乏仿制药对这种操作没有帮助。示例:

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

我还认为您应该制作Nearby的所有属性指针,这样您就可以始终将它们与nil进行比较,以确保它们没有被设置。

最新更新