在Golang中复制非空结构值以更新数据存储

时间:2017-12-07 03:52:52

标签: go struct patch datastore

我正在编写PATCH API,没有必要在请求中发送所有字段。我只想更新新字段。 我正在使用数据存储区,我认为,我需要发送包含我想要保存的最终值的整个结构,因为它替换了所有值。 我在一个结构中从DB中检索现有值,并且我在另一个结构中有请求。

type product struct {
    TITLE    string `json:"title"`
    SUMMARY  string `json:"summary"`
    IMAGEURL string `json:"imageUrl"`
    CATEGORY string `json:"category"`
    TYPE     int    `json:"type"`
}

var dbVal product // Holds the existing DB values
var formVal product // Holds the values received from web form (api request)

formVal不需要拥有所有值。如果请求中未发送字段,则为空。

如果formVal字段不为空,我希望使用formVal ONLY 中的值更新dbVal结构(!=""表示字符串,或者!= 0表示int)

PS:我搜索了一天以上并尝试了不同的示例,并尝试使用其他一些答案的反射,但无法找到如何将值分配给另一个结构。如果已经回答了这个问题,我很抱歉重新发布此信息 - 请分享链接。

2 个答案:

答案 0 :(得分:0)

我建议稍微改变结构以使用指针:

type product struct {
    TITLE    *string `json:"title"`
    SUMMARY  *string `json:"summary"`
    IMAGEURL *string `json:"imageUrl"`
    CATEGORY *string `json:"category"`
    TYPE     *int    `json:"type"`
}

然后您可以使用reflect遍历补丁实体并替换非零值。检查Go Playground中的示例。

答案 1 :(得分:0)

考虑在产品类型上编写一个实用程序方法,检查它是否为空,并使用它来确定是否更新数据库值,例如:

func (p product) isEmpty() bool {
  return (p.TITLE == "") && (p.SUMMARY == "") && (p.IMAGEURL == "") && (p.CATEGORY == "") && (p.TYPE == 0)
}
// ...

if !formVal.isEmpty() {
  // Update database values...
}