只更新golang中的非空结构字段

时间:2018-04-06 22:13:08

标签: go

是否有一种简单的方法只能更新go(-lang)中的非零/空字段?

鉴于这两个结构:

type UserAccount struct {
    Id         string `json:"id" binding:"required"`
    Enrolled   bool   `json:"enrolled" binding:"required"`
    Email      string `json:"email" binding:"required"`
    GivenName  string `json:"given_name" binding:"required"`
    FamilyName string `json:"family_name" binding:"required"`
    PictureURL string `json:"picture" binding:"required"`
    Nickname   string `json:"nickname" binding:"required"`
}
type ProfilePayload struct {
    Email      string `json:"email,omitempty"`
    GivenName  string `json:"given_name,omitempty"`
    FamilyName string `json:"family_name,omitempty"`
    PictureURL string `json:"picture,omitempty"`
    Nickname   string `json:"nickname,omitempty"` 
}

是否可以仅更新UserAccount结构中的非零字段。例如,除了Email之外的所有字段在ProfilePayload中都是nil / empty,是否有一种简单的方法将它们“合并”在一起,只将UserAccount中的Email字段设置为新值并保持UserAccount中的其他所有字段相同? / p>

if payload.Email != "" {
    account.Email = payload.Email
}
....

对我来说真的不是一个选择。

1 个答案:

答案 0 :(得分:1)

如果您只是重新构建代码

,该怎么办?
type ProfilePayload struct {
    Email      string `json:"email,omitempty"`
    GivenName  string `json:"given_name,omitempty"`
    FamilyName string `json:"family_name,omitempty"`
    PictureURL string `json:"picture,omitempty"`
    Nickname   string `json:"nickname,omitempty"` 
}
type UserAccount struct {
    Id         string `json:"id" binding:"required"`
    Enrolled   bool   `json:"enrolled" binding:"required"`
    ProfilePayload //now it has all the fields from ProfilePayload
}

解码为json时,只需将其解码为UserAccount,然后如果需要,可以从UserAccount中提取ProfilePayload