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

仅更新golang中的非空结构字段,go,Go,有没有一种简单的方法只更新go(-lang)中的非nil/空字段 考虑到这两种结构: type UserAccount struct { Id string `json:"id" binding:"required"` Enrolled bool `json:"enrolled" binding:"required"` Email string `json:"email" binding:"required"` GivenName

有没有一种简单的方法只更新go(-lang)中的非nil/空字段

考虑到这两种结构:

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结构中的非nil字段。例如,ProfilePayload中除电子邮件外的所有字段均为零/空,是否有一种简单的方法将它们“合并”在一起,并且仅将UserAccount中的电子邮件字段设置为新值,并保持UserAccount中的所有其他内容不变

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

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

如果你只是重新构造了你的代码呢

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(如果您需要)

如果您只是重新构造了代码呢

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,如果你愿意的话

为什么你提到的条件不是一个选项?因为我想用相当大的结构来做,必须有一个更好的解决方案。唯一不用显式检查每个字段的方法就是反射。看。为什么你提到的条件不是一个选项?因为我想用相当大的结构来做,必须有一个更好的解决方案。不显式检查每个字段的唯一方法是使用反射。看见