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

标签 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 结构中的非零字段。例如,ProfilePayload 中除 Email 之外的所有字段都是零/空,是否有一种简单的方法可以将它们“合并”在一起,并且只将 UserAccount 中的 Email 字段设置为新值并保持 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

关于go - 仅更新 golang 中的非空结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49701658/

相关文章:

Golang 中的 JavaScript getTimezoneOffset() 方法

multithreading - Golang 如何在 goroutine 之间共享变量?

go - 获取字符串中某个字符的地址

go - 在 Go 中将字符串转换为固定大小的字节数组

go - 为什么逐行读取文件需要更多内存?

go - 用于在 Go 中组织项目文件的 Cmd 文件夹

go - 在同一包中找不到结构

go - 从接口(interface)类型转换为实际类型的不可能的类型断言

Go url 参数映射

go - 如何使 go build 使用嵌套目录