golang 反射, 诡异的数据类型。 Type.Tag

Able · · 3037 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

最近再实现一些功能, 用到了protobuf 还有 xml 。从他们书写的类型或是测试用例中, 看到了大量这样的数据结构:

type Person struct {

Name string `xml:"name"`

URI string `xml:"uri,attr"`

Email string `xml:"email,omitempty"`

InnerXML string `xml:",innerxml"`

}

源码可以见xml/marshal_test.go

http://golang.org/src/pkg/encoding/xml/marshal_test.go

Person 类型中, 红色字, 反引号括起来的这部分是什么?干什么用的?

从源码中顺藤摸瓜,一直找到了xml的私有库 typeinfo:

http://golang.org/src/pkg/encoding/xml/typeinfo.go

51行:

func getTypeInfo(typ reflect.Type) (*typeInfo, error) {

还有111行 :

func structFieldInfo(typ reflect.Type, f *reflect.StructField) (*fieldInfo, error) {
看完这两个函数的使用后, 终于找到答案了。
重点在于 reflect.StructField 数据类型。然后我们看怎么样通过一个简单的例子得到它。

函数库的 reflect.TypeOf 或者reflect.ValueOf(xx).Type() 返回的reflect.Type 数据类型。  


package main
import (
"reflect"
"fmt"
)
type Info struct {
name string `abc:"type,attr,omitempty" nnn:"xxx"`
//pass struct{} `test`
}
func main() {
info := Info{"hello"}
ref := reflect.ValueOf(info)
fmt.Println(ref.Kind())
fmt.Println(reflect.Interface)
fmt.Println(ref.Type())
typ := reflect.TypeOf(info)
n := typ.NumField()
for i := 0; i < n; i++ {
f := typ.Field(i)
fmt.Println(f.Tag)
fmt.Println(f.Tag.Get("nnn"))
fmt.Println(f.Name)} }

http://play.golang.org/p/aPb9JBZaX5

struct
interface
main.Info
abc:"type,attr,omitempty" nnn:"xxx"
xxx
name


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:Able

查看原文:golang 反射, 诡异的数据类型。 Type.Tag

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3037 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传