在使用数据库之前,我正在创建一个简单的内存服务器。我有这个更新方法:
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
但我只想在定义了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进行比较,以确保它们没有被设置。