1 回答

TA貢獻1829條經驗 獲得超9個贊
我更愿意解碼成一個結構并讓json/encoding處理正確類型的工作。
type Input struct {
Title,
Selection string
CostPerDayInCent int64
Description string
User int64
AllowMobileContact,
AllowEmailContact,
IsActive bool
}
由于幾個原因,這種方法非常普遍和有用。首先,您可以選擇類型。其次,您正在定義一個類型,因此您可以附加函數,我發現它作為一種組織代碼并避免將結構作為顯式函數參數傳遞的方法非常方便。第三,您可以將注釋附加到結構的字段,進一步調整解組。
最后,對我來說,最重要的是,您正在以 Go 處理數據的方式思考數據。在許多流行的現代語言(如 Python)中,代碼和文檔通常不會將類型附加到函數,或嘗試顯式枚舉對象的屬性。圍棋不一樣。它消除了固有的語言反射是它如此高效的原因之一。這可以為程序員提供巨大的好處——當您了解所有類型時,您就可以確切地知道事物的行為方式,并且可以準確地確定必須傳遞您調用的函數的內容。我建議您接受顯式類型,并盡可能避免將 json 解碼為面向接口的類型。你會知道你在處理什么,你也可以為你的消費者明確地定義它。
https://play.golang.org/p/egaequIT8ET與您的方法形成鮮明對比,您無需費心定義類型 - 但您也沒有機會選擇它們。
package main
import (
"bytes"
"encoding/json"
"fmt"
)
type Input struct {
Title,
Selection string
CostPerDayInCent int64
Description string
User int64
AllowMobileContact,
AllowEmailContact,
IsActive bool
}
func main() {
var input = `{
"Title": "Example Title",
"Section": "machinery",
"CostPerDayInCent": 34500,
"Description": "A description",
"User": 4,
"AllowMobileContact": true,
"AllowEmailContact": true,
"IsActive": false
}`
// map[string]interface
data := make(map[string]interface{})
if err := json.NewDecoder(bytes.NewBufferString(input)).Decode(&data); err != nil {
panic(err)
}
fmt.Printf("%f %T\n", data["CostPerDayInCent"], data["CostPerDayInCent"])
// structure
obj := new(Input)
if err := json.NewDecoder(bytes.NewBufferString(input)).Decode(obj); err != nil {
panic(err)
}
fmt.Printf("%d %T", obj.CostPerDayInCent, obj.CostPerDayInCent)
}
- 1 回答
- 0 關注
- 165 瀏覽
添加回答
舉報