【问题标题】:Gorm return empty object instead default object when value is not found当未找到值时,Gorm 返回空对象而不是默认对象
【发布时间】:2018-12-13 17:54:30
【问题描述】:

我在一个小型 go 应用程序中使用 GORM 进行了 MySQL 查询。

我已经声明了我的 domain 结构

type Domain struct {
    gorm.Model
    Name string
    ...
}

然后,当我使用 GORM 使用这种方法向 MySQL 发送查询时。

func DomainInfos(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    w.WriteHeader(http.StatusOK)

    var d Domain

    config.DbConnection.Where("name = ?", vars["domain"]).Find(&d)

    json.NewEncoder(w).Encode(d)
}

当找不到域时,它会从我的结构定义中返回一个默认对象

{
    {0 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC <nil>} 
    0
    0
    0
}

所以我写了一个小条件来手动返回一个空对象

if d.ID == 0 {
    json.NewEncoder(w).Encode(make(map[string]string))
    return
}

是否可以在查询不返回任何内容时直接返回一个空对象,以避免这种手动检查?

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    GORM is 返回一个空对象;当谈到 Go 值时,“空”和“默认”是相同的,实际上称为 zero value。在您的情况下,您需要控制 JSON 输出,而不是 GORM 返回值。

    您可以将 omitempty 标记添加到您的字段中,如果它们的类型包含零值,则可以将它们从 JSON 输出中排除:

    type Domain struct {
        gorm.Model
        Name string `json:",omitempty"`
        ...
    }
    

    对于每个带有此标签的字段,当您调用EncodeMarshal 时,如果该字段包含其零值(例如,对于Name,它是一个string,如果它等于"" ),该字段将不会包含在输出中。如果您以这种方式标记所有导出的字段,并且它们都包含零值,则输出将是一个空的 JSON 对象{}

    还要注意:

    json.NewEncoder(w).Encode(make(map[string]string))
    

    等效于,但效率明显低于:

    w.Write([]byte("{}"))
    

    您的另一个选择是自定义元帅 func,如下所示:

    func (d Domain) MarshalJSON() ([]byte, error) {
        if t.ID == 0 {
            return []byte("{}"), nil
        }
    
        // Wrap the type to avoid infinite recursion on MarshalJSON
        type dd Domain
        return json.Marshal(dd(d))
    }
    

    您可以在此处查看工作示例:https://play.golang.org/p/mIRfRKXeyyW

    【讨论】:

    • 这适用于Name,...但它仍然返回gorm.Model 值。我还尝试将json:",omitempty" 添加到gorm.Model 没有成功
    • 如果没有省略该字段,则该字段不包含其类型的零值。
    • 我认为这是因为gorm.Model 扩展了我的结构并添加了非省略字段。
    • 我添加了另一个选项,以防第一个选项不适用于您的情况。它不太直观,但可能会有所帮助。
    猜你喜欢
    • 2020-05-27
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2018-12-18
    • 2017-09-02
    • 2020-06-13
    相关资源
    最近更新 更多