github.com/chain5j/chain5j-pkg@v1.0.7/util/reflectutil/tag_test.go (about) 1 // Package reflectutil 2 // 3 // @author: xwc1125 4 package reflectutil 5 6 import ( 7 "fmt" 8 "go/doc" 9 "go/parser" 10 "go/token" 11 "reflect" 12 "testing" 13 ) 14 15 const name = "常量" // 常量doc 16 17 var age = 10 // 参数doc 18 19 // 学生表 20 type Student struct { 21 Name string `chain5j:"stu_name,nil"` // 姓名 22 Age int // 年龄 23 Score float32 // 分数 24 sex int // 性别 25 } 26 27 // 打印内容 28 func (s Student) Print() { 29 fmt.Println(s) 30 } 31 32 // 内部打印内容 33 func (s Student) print() { 34 fmt.Println(s) 35 } 36 37 func TestTag(t *testing.T) { 38 var a = Student{ 39 Name: "stu01", 40 Age: 18, 41 Score: 92.8, 42 } 43 TagStruct(&a) 44 45 valueOf := reflect.ValueOf(&a) 46 s := valueOf.Elem() 47 typeOfT := s.Type() 48 for i := 0; i < s.NumField(); i++ { 49 // 获取字段内容 50 f := s.Field(i) 51 fmt.Printf("%d: %s %s = %v\n", i, 52 typeOfT.Field(i).Name, // 字段名称 53 f.Type(), // 字段类型 54 f.Interface()) // 字段值 55 } 56 // 设置 57 s.Field(0).SetString("stu") 58 s.Field(1).SetInt(77) 59 s.Field(2).SetFloat(77.0) 60 fmt.Println("a is now", a) 61 62 v := valueOf.MethodByName("Print") 63 v.Call([]reflect.Value{}) 64 } 65 66 func TagStruct(a interface{}) { 67 typ := reflect.TypeOf(a) 68 69 tag := typ.Elem().Field(0).Tag.Get("chain5j") 70 fmt.Printf("Tag:%s\n", tag) 71 } 72 73 func TestDoc(t *testing.T) { 74 fset := token.NewFileSet() // positions are relative to fset 75 d, err := parser.ParseDir(fset, "./", nil, parser.ParseComments) 76 if err != nil { 77 fmt.Println(err) 78 return 79 } 80 for k, f := range d { 81 fmt.Println("package", k) 82 for n, f := range f.Files { 83 // 文件列表 84 fmt.Println(fmt.Sprintf("文件名称: %q", n)) 85 // f.Doc 文件注释 86 // f.Scope 当前文件下的直接调用的方法/struct 87 // f.Imports 引入的文件 88 for i, c := range f.Comments { 89 // 所有的注释 90 fmt.Println(fmt.Sprintf("Comment Group %d", i)) 91 for _, c1 := range c.List { 92 // fmt.Println(fmt.Sprintf("Comment %d: Position: %d, Text: %q", i2, c1.Slash, c1.Text)) 93 fmt.Println(fmt.Sprintf("Text: %q", c1.Text)) 94 } 95 } 96 } 97 98 p := doc.New(f, "./", doc.AllDecls) // doc.AllDecls显示私有和公有,AllMethods:显示公有 99 // p.Name 包名 100 // p.ImportPath 引入地址 101 // p.Imports 引入 102 // p.Filenames 包下的文件 103 // p.Filenames 包下的文件 104 // p.Consts 常量的声明 105 // p.Types type的声明 106 // p.Vars var的声明 107 // p.Funcs func的声明 108 109 for _, t := range p.Types { 110 fmt.Println("type=", t.Name, "docs=", t.Doc) 111 for _, m := range t.Methods { 112 fmt.Println("type=", m.Name, "docs=", m.Doc) 113 } 114 } 115 116 for _, v := range p.Vars { 117 fmt.Println("type", v.Names) 118 fmt.Println("docs:", v.Doc) 119 } 120 121 for _, f := range p.Funcs { 122 fmt.Println("type", f.Name) 123 fmt.Println("docs:", f.Doc) 124 } 125 126 for _, n := range p.Notes { 127 fmt.Println("body", n[0].Body) 128 } 129 } 130 }