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  }