为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中,定义明确的类型的 JSON 封送处理会失败吗?

在 Go 中,定义明确的类型的 JSON 封送处理会失败吗?

Go
动漫人物 2022-03-03 14:55:25
给定以下代码:package mainimport (    "encoding/json"    "fmt"    "log")type Employee struct {    Id int "json:id"}func main() {    b, err := json.Marshal(&Employee{Id: 2})    if err != nil {        log.Fatal("Couldn't marshal the Employee")    }    fmt.Println(string(b))}由于结构定义明确,因此可以使用_占位符可靠地忽略检查错误。Employee理论上它应该永远不会失败,所以问题是忽略这种类型的错误并在这种类型的样板错误检查上节省一点是一个好习惯吗?忽略看起来像这样:package mainimport (    "encoding/json"    "fmt")type Employee struct {    Id int "json:id"}func main() {    b, _ := json.Marshal(&Employee{Id: 2})    fmt.Println(string(b))}
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

错误处理和 Go:


正确的错误处理是好的软件的基本要求。


通常你的代码不会失败。但如果用户将此MarshalJSON方法接收器添加到您的类型,则会失败:


func (t *Employee) MarshalJSON() ([]byte, error) {

    if t.Id == 2 {

        return nil, fmt.Errorf("Forbiden Id = %d", t.Id)

    }

    data := []byte(fmt.Sprintf(`{"Id":%d}`, t.Id))

    return data, nil

}

此代码编译,但仅出于Id == 2(The Go Playground)的目的而失败:


package main


import (

    "encoding/json"

    "fmt"

    "log"

)


type Employee struct {

    Id int "json:id"

}


func main() {

    b, err := json.Marshal(&Employee{Id: 2})

    if err != nil {

        log.Fatal("Couldn't marshal the Employee", err)

    }


    fmt.Println(string(b))

}


func (t *Employee) MarshalJSON() ([]byte, error) {

    if t.Id == 2 {

        return nil, fmt.Errorf("Forbiden Id = %d", t.Id)

    }

    data := []byte(fmt.Sprintf(`{"Id":%d}`, t.Id))

    return data, nil

}

此代码也编译,但失败(The Go Playground):


package main


import (

    "encoding/json"

    "fmt"

    "log"

)


type Employee struct {

    Id int "json:id"

}


func main() {

    b, err := json.Marshal(&Employee{Id: 2})

    if err != nil {

        log.Fatal("Couldn't marshal the Employee")

    }


    fmt.Println(string(b))

}


func (t Employee) MarshalJSON() ([]byte, error) {

    data := []byte(fmt.Sprint(t))

    return data, nil

}


查看完整回答
反对 回复 2022-03-03
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

您始终可以编写自己的“包装器”包来组合可能是样板的行为。例如,如果您设置了日志系统,您可能会构建一个小包,如下所示:


package json

import (

  "encoding/json"

  "log"

)

func TryMarshal(v interface{}) []byte {

  b, err := json.Marshal(v)

  if err != nil {

    log.Println(err)

    return nil

  }

  return b

}


查看完整回答
反对 回复 2022-03-03
  • 2 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信