

gencodec工具
source link: https://studygolang.com/articles/29133
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

gencodec
百度了一下,居然找不到gencodec工具的中文使用介绍,对我这种 拿来主义
的人真有点不适应,简单总结一下介绍使用。
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的调用可以指定一个额外的“字段覆盖”结构,从中进行封送处理类型替换。如果覆盖结构体中字段名称与原结构体中字段匹配,则生成的封送处理方法将使用覆盖的类型并与原始字段类型进行转换。如果覆盖结构体中字段名称与原结构体中字段不匹配,但有与原结构体中的同名且无参数的方法,并且该方法的返回值与字段类型相同,则Marshal*调用该方法。如果有匹配的方法F,但是返回类型或参数不合适,就会引发错误;unmarshaling时该字段无意义。
type specialString string func (s *specialString) UnmarshalJSON(input []byte) error { ... } type Foo struct{ S string } type fooMarshaling struct{ S specialString } // 被自动转换为 func (f *Foo) UnmarshalJSON(input []byte) error { var dec struct{ S *specialString } ... f.S = string(dec.specialString) // 直接类型转换 ... }
覆盖结构体中的字段类型必须可以简单地转换为原始字段类型。gencodec支持以下转换:
- 如果字段是可直接分配的,则不会发出转换。
- 如果字段可以根据Go语言规则进行转换,则会发出一个简单的转换。
如上,覆盖结构体fooMarshaling
.S
的类型specialString
可直接转成string
,即使specialString
实现了UnmarshalJSON,也不会在gencodec的unmarshaling中嵌套调用,而是直接转换。
参考:
https://godoc.org/github.com/fjl/gencodec
欢迎关注我们的微信公众号,每天学习Go知识

Recommend
-
150
-
115
作为社交工具,微信为什么没有强化分组功能? - PMCAFF产品经理社区 未央哦 首先...
-
204
Please wait... We are checking your browser... www.uisdc.com What can I do to prevent this in the...
-
162
在我的工作和生活中,我一直都很注重效率工具的使用,这么些年下来也积累好几款很不错,但是又不为大多数人所熟知的软件工具,我用起来得心应手,很不错。那我就像在此给大家做个分享,希望你们都能多多提升工作效率。
-
178
Chrome开发者工具Debug入门译者按: 手把手教你摆脱console.log,掌握高级的 debug 方...
-
99
你似乎来到了没有知识存在的荒原3 秒后自动跳转至知乎首页去往首页
-
114
光叔最近在走穴!我上班累成狗(谁说国外不加班过来我打你),方正7*24小时加班更是累成狗都不如!所以没更新,大家谅解,给您作揖了!因为我的懒惰,回家就睡觉,导致我完全不看Facebook了,但是昨天我
-
145
这是一个收集Mac应用程序、软件、工具的仓库 github地址 寻求有志之士一起维护(加VX:18656319235--备注:维护-模块/新建-模块) 目录 -编辑器 -工具 -虚拟机 -FTP -产品与设计 -创作 -电脑辅助工具 编辑器 通用 Sub
-
151
Dawn 取「黎明、破晓」之意,原为「阿里云·业务运营团队」内部的前端构建和工程化工具,现已完全开源。它通过 pipeline 和 middleware 将开发过程抽象为相对固定的阶段和有限的操作,简化并统一了开发人员的日常构建与开发相关的工作。 Git Re
-
98
程序员编程最常用的8大工具,你用过几个?-51CTO.COM
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK