Go 如何从对象中删除属性

Go 如何从对象中删除属性,go,go-gorm,go-gin,Go,Go Gorm,Go Gin,我有一个用户结构: type User struct { gorm.Model Email string Password string AccountType int CompanyId int FirstName string LastName string PhoneNumber string RecoveryEmail string Contract

我有一个用户结构:

type User struct {
    gorm.Model
    Email         string
    Password      string
    AccountType   int
    CompanyId     int
    FirstName     string
    LastName      string
    PhoneNumber   string
    RecoveryEmail string
    Contractor    bool `gorm:"sql:'not null' default:'false'"`
}
我使用此结构使用gorm从数据库中获取一行:

我的杜松子酒:

// @Summary Attempts to get a existing user by id
// @tags users
// @Router /api/users/getUserById [get]
func HandleGetUserById(c *gin.Context) {
    // Were using delete params as it shares the same interface.
    var json deleteParams

    if err := c.Bind(&json); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"message": "No user ID found, please try again."})
        return
    }

    outcome, err := getUser(json.Id)

    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"message": "Something went wrong while trying to process that, please try again.", "error": err.Error()})
        log.Println(err)
        return
    }

    c.JSON(http.StatusOK, gin.H{
        "message": "Successfully found user",
        "user":    outcome,
    })

}
它返回一切正常,但当我返回&user时,未选择的字段将返回默认值:

{
    "message": "Successfully found user",
    "user": {
        "ID": 53,
        "CreatedAt": "2018-06-24T00:05:49.761736+01:00",
        "UpdatedAt": "0001-01-01T00:00:00Z",
        "DeletedAt": null,
        "Email": "jack@jackner.com",
        "Password": "",
        "AccountType": 0,
        "CompanyId": 2,
        "FirstName": "",
        "LastName": "",
        "PhoneNumber": "",
        "RecoveryEmail": "",
        "Contractor": false
    }
}
是否有办法从对象中删除空或空属性?或者,我必须将映射到所述新对象的值发送回一个对象吗?如果有一种简单的方法可以使用helper函数实现前者,我想知道如何实现。

您可以在对象的字段定义中指定省略空标记

例如:

Email string `json:",omitempty"`
如果以这种方式定义字段,JSON输出中将不存在空值:

omitempty选项指定,如果字段具有空值(定义为false、0、nil指针、nil接口值)以及任何空数组、切片、映射或字符串,则应在编码中省略该字段


您会因为更新工作流而询问吗,例如,获取对象、修改字段,并且不想用这些零值更新/覆盖字段?@dm03514更新工作流在我的其他方法中按预期工作,我不介意默认值,我只是不想用每个表键从api发送整个对象,即使是空的,我想我也在努力避免只返回一个映射对象。我更喜欢编辑我的指针,然后只为输出返回它。我已经更新了我的问题,将gin处理程序也包括在内,以便为我当前正在执行的整个过程提供更好的上下文。您的字段为空。如果希望它们为null,则需要一个能够为null的字段。字符串不能为空。字符串指针可以是。@Patrick如果您在响应中看到,即使属性为null,它也不会从对象中删除,我希望删除这些属性,以便它可以在返回时作为json发送回去,我不认为简单地将它们设置为可为null的类型会改变这一点,根据描述,我将尝试一下。这正是我一直在寻找的,但在gorm手册中找不到的,非常感谢您的回答。
Email string `json:",omitempty"`