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

给定以下代码:


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))

}

由于结构定义明确,因此可以使用_占位符可靠地忽略检查错误。Employee理论上它应该永远不会失败,所以问题是忽略这种类型的错误并在这种类型的样板错误检查上节省一点是一个好习惯吗?


忽略看起来像这样:


package main


import (

    "encoding/json"

    "fmt"

)


type Employee struct {

    Id int "json:id"

}


func main() {

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

    fmt.Println(string(b))

}


动漫人物
浏览 138回答 2
2回答

慕勒3428872

错误处理和 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 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", 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 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))}func (t Employee) MarshalJSON() ([]byte, error) {    data := []byte(fmt.Sprint(t))    return data, nil}

拉莫斯之舞

您始终可以编写自己的“包装器”包来组合可能是样板的行为。例如,如果您设置了日志系统,您可能会构建一个小包,如下所示:package jsonimport (  "encoding/json"  "log")func TryMarshal(v interface{}) []byte {  b, err := json.Marshal(v)  if err != nil {    log.Println(err)    return nil  }  return b}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go