gpt4 book ai didi

go - 在 Go 中,定义明确的类型的 JSON 编码(marshal)处理会失败吗?

转载 作者:IT老高 更新时间:2023-10-28 13:07:29 36 4
gpt4 key购买 nike

给定以下代码:

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

最佳答案

Error handling and Go :

Proper error handling is an essential requirement of good software.


通常您的代码不会失败。但如果用户将此 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
}

关于go - 在 Go 中,定义明确的类型的 JSON 编码(marshal)处理会失败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39109003/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com