2 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
錯(cuò)誤處理和 Go:
正確的錯(cuò)誤處理是好的軟件的基本要求。
通常你的代碼不會(huì)失敗。但如果用戶將此MarshalJSON方法接收器添加到您的類型,則會(huì)失敗:
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)的目的而失?。?/p>
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
}
此代碼也編譯,但失?。═he 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
}

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
您始終可以編寫自己的“包裝器”包來組合可能是樣板的行為。例如,如果您設(shè)置了日志系統(tǒng),您可能會(huì)構(gòu)建一個(gè)小包,如下所示:
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
}
- 2 回答
- 0 關(guān)注
- 170 瀏覽
添加回答
舉報(bào)