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

复制Golang中的非空结构值以更新数据存储,go,struct,patch,datastore,Go,Struct,Patch,Datastore,我正在编写一个补丁API,不需要发送请求中的所有字段。我只想更新新字段。 我正在使用数据存储,我想,我需要发送包含我想要保存的最终值的整个结构,因为它替换了所有的值。 我在一个结构中从DB检索现有值,在另一个结构中有请求 type product struct { TITLE string `json:"title"` SUMMARY string `json:"summary"` IMAGEURL string `json:"imageUrl"` CAT

我正在编写一个补丁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字段不为空(!=“”表示字符串或!=0表示int),我希望使用formVal中的值更新dbVal结构


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

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

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

然后,您可以使用
reflect
遍历面片实体,并替换非nil值。签入示例。

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

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

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

您已经给出了问题的答案:检查“!=”表示字符串或!=0表示int”。对所有字段执行此操作,如果,则使用一些
。这里不需要火箭科学。Go是一种“没有魔法”的语言,您可以通过编程而不是魔法来完成任务。但也许我误解了这个问题?那是不可伸缩的。我有14个结构域!我只是举了一个例子,我的整个结构很少。我的结构也有bool、int64和数组类型的数据。我只是想找一个线索来开始处理逻辑。我知道如何设置结构的范围,找到每个字段类型,并作为接口获取值。我面临的唯一问题是将值赋给另一个结构字段,然后要么编写14个if(适用于bools,也适用于uint64),要么编写数组代码。写代码有什么问题?如果这不能“伸缩”,则编写代码,通过使用包反射遍历结构来概括这一点(这需要大量工作,伸缩性甚至更低,速度也更慢)。如果您遇到了可寻址性和可分配性问题:在lockstep中遍历三个结构,在前两个结构的基础上构建第三个结构。这真的更复杂。谷歌搜索“golang merge structs”会产生多个点击,其中一个甚至会有帮助。请参阅此处介绍的技术:。比如dbval.TITLE=“Prod1”,dbval.SUMMARY=“Desc”。formVal.TITLE=“”和formVal.SUMMARY=“New Desc”我只想更新摘要而忽略标题属性更新。我想要的最终结果是:dbval.TITLE=“Prod1”,dbval.SUMMARY=“New Desc”。@deepakssn yes,然后编写一个函数仅复制存在的字段。另外,请用这些详细信息更新您的问题