在数据传递时,需要先编解码;常用的方式是JSON编解码(参见《 golang之JSON处理》)。但有时却需要读取部分字段后,才能知道具体类型,此时就可借助mapstructure库了。
mapstructure库
mapstructure可方便地实现map[string]interface{}与struct间的转换;使用前,需要先导入库:
go get github.com/mitchellh/mapstructure
字段标签
默认情况下,mapstructure使用字段的名称做匹配映射(即在map中以字段名为键值查找字段值);注意匹配时是忽略大小写的。也可通过标签来设定字段映射名称:
type Person struct {
Name string `mapstructure:"userName"`
}
内嵌结构
go中结构体是可以任意嵌套的;嵌套后即认为拥有对应的字段。但是,默认情况下mapstructure只处理当前结构定义的字段,若要自动处理内嵌字段需要添加标签squash:
type Student struct {
Person `mapstructure:",squash"`
Age int
}
未映射字段
若源数据中有未映射的值(即结构体中无对应的字段),mapstructure默认会忽略它。可以在结构体中定义一个特殊字段(类型为map[string]interface{},且标签要设置为mapstructure:",remain"),来存放所有未能映射的字段中。
type Student struct {
Name string
Age int
Other map[string]interface{
} `mapstructure:",remain"`
}
Metadata
mapstructure中可以使用Metadata收集一些解码时会产生的有用信息。
// mapstructure.go
type Metadata struct {
Keys []string // 解码成功的键
Unused []string // 源数据中存在,但目标结构中不存在的键
Unset []string // 未设定的(源数据中缺失的)键
}
为了获取这些信息,需要使用DecodeMetadata来解码:
var metadata mapstructure.Metadata
err

文章介绍了Golang中mapstructure库的使用,包括结构体与map之间的转换,字段标签的设定,内嵌结构的处理,未映射字段的存储,Metadata信息的获取,弱类型输入的处理以及如何进行逆向转换。同时,提供了一个解码器配置的示例,展示了如何根据不同的数据动态转换结构体。
最低0.47元/天 解锁文章
2299

被折叠的 条评论
为什么被折叠?



