gencodec
百度了一下惕味,居然找不到gencodec工具的中文使用介紹,對我這種拿來主義
的人真有點不適應玉锌,簡單總結(jié)一下介紹使用名挥。
gencodec是一個非常便捷的通過類型自動生成marshaling代碼的工具,工具的安裝就不細說了主守,基本沒有使用其他庫除了golang.org/x
里某些庫禀倔,地址:https://github.com/fjl/gencodec。
使用方式:
gencodec -type MyType -field-override MyTypeMarshaling -formats json,yaml,toml -out mytype_json.go
在相應的包下指定:
- type: 需要生成的類型名
- formats: 樣式,支持三種
json
,yaml
,toml
,默認json
- field-override: (可選)覆蓋類型
- out: 生成的文件
類型
type foo struct {
Required string `gencodec:"required"` //unmarshaling時需要檢查該字段是否存在
Optional string // 文件中字段以原名標識
Renamed string `json:"otherName"` //封送到相應樣式文件中的字段名
}
字段覆蓋
type foo struct {
Field string
SpecialField string
}
func (f foo) Func() string {
return f.Field + "-" + f.SpecialField
}
type fooMarshaling struct {
SpecialField specialString // overrides type of SpecialField when marshaling/unmarshaling
Func string `json:"id"` // adds the result of foo.Func() to the serialised object under the key id
}
gencodec的調(diào)用可以指定一個額外的“字段覆蓋”結(jié)構(gòu)参淫,從中進行封送處理類型替換救湖。如果覆蓋結(jié)構(gòu)體中字段名稱與原結(jié)構(gòu)體中字段匹配,則生成的封送處理方法將使用覆蓋的類型并與原始字段類型進行轉(zhuǎn)換涎才。如果覆蓋結(jié)構(gòu)體中字段名稱與原結(jié)構(gòu)體中字段不匹配鞋既,但有與原結(jié)構(gòu)體中的同名且無參數(shù)的方法,并且該方法的返回值與字段類型相同耍铜,則Marshal*調(diào)用該方法邑闺。如果有匹配的方法F,但是返回類型或參數(shù)不合適棕兼,就會引發(fā)錯誤陡舅;unmarshaling時該字段無意義。
type specialString string
func (s *specialString) UnmarshalJSON(input []byte) error { ... }
type Foo struct{ S string }
type fooMarshaling struct{ S specialString }
// 被自動轉(zhuǎn)換為
func (f *Foo) UnmarshalJSON(input []byte) error {
var dec struct{ S *specialString }
...
f.S = string(dec.specialString) // 直接類型轉(zhuǎn)換
...
}
覆蓋結(jié)構(gòu)體中的字段類型必須可以簡單地轉(zhuǎn)換為原始字段類型伴挚。gencodec支持以下轉(zhuǎn)換:
- 如果字段是可直接分配的靶衍,則不會發(fā)出轉(zhuǎn)換。
- 如果字段可以根據(jù)Go語言規(guī)則進行轉(zhuǎn)換茎芋,則會發(fā)出一個簡單的轉(zhuǎn)換颅眶。
如上,覆蓋結(jié)構(gòu)體fooMarshaling
.S
的類型specialString
可直接轉(zhuǎn)成string
,即使specialString
實現(xiàn)了UnmarshalJSON败徊,也不會在gencodec的unmarshaling中嵌套調(diào)用帚呼,而是直接轉(zhuǎn)換。
參考: