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