/**package: TracerAnalyzefilename: mainauthor: diogotime: 2021/2/19 14:17**/package mainimport ("fmt""reflect")//定义Monster结构体type Monster struct {Name string `json:"name"`Age int `json:"monster_age"`Score float32 `json:"成绩"`Sex string}//方法,返回两个数的和func (s Monster) GetSum(n1, n2 int) int {return n1 + n2}//方法,接受4个值,给s赋值func (s Monster) Set(name string, age int, score float32, sex string) {s.Name = names.Age = ages.Score = scores.Sex = sex}//方法,显示s的值func (s Monster) Print() {fmt.Println("----start----")fmt.Println(s)fmt.Println("----end----")}func TestStruct(a interface{}) {typ := reflect.TypeOf(a)val := reflect.ValueOf(a) //获取reflect.Type类型kd := val.Kind() //获取到a对应的类别if kd != reflect.Struct {fmt.Println("expect struct")return}//获取到该结构体有几个字段num := val.NumField()fmt.Printf("该结构体有%d个字段\n", num) //4个//遍历结构体的所有字段for i := 0; i < num; i++ {fmt.Printf("Field %d:值=%v\n", i, val.Field(i))//获取到struct标签,需要通过reflect.Type来获取tag标签的值tagVal := typ.Field(i).Tag.Get("json")//如果该字段有tag标签就显示,否则就不显示if tagVal != "" {fmt.Printf("Field %d:tag=%v\n", i, tagVal)}}//获取到该结构体有多少个方法numOfMethod := val.NumMethod()fmt.Printf("struct has %d methods\n", numOfMethod)//方法的排序默认是按照函数名的顺序(ASCII码)val.Method(1).Call(nil) //获取到第二个方法,调用它//调用结构体的第1个方法,Method(0)var params []reflect.Valueparams = append(params, reflect.ValueOf(10))params = append(params, reflect.ValueOf(40))//传入的参数是 []reflect.Value,返回 []reflect.Valueres := val.Method(0).Call(params)//返回结果,返回的结果是 []reflect.Valuefmt.Println("返回的结果 res=", res[0].Int())fmt.Println(val.Method(1).Kind().String())//fmt.Println(val.Method(1).Elem())fmt.Printf("该结构体有 %d 个方法",typ.NumMethod())fmt.Println(typ.Method(0).Name)fmt.Println(typ.Method(1).Name)fmt.Println(typ.Method(2).Name)//pointer:= reflect.ValueOf(val.Method(1)).Pointer()//funcName := runtime.FuncForPC(pointer).Name()////fmt.Println(funcName)//fmt.Println(val.MapKeys())}func main() {//创建一个Monster实例var a Monster = Monster{Name: "张三丰",Age: 99,Score: 80.5,}//将Monster实例传递给TestStruct函数TestStruct(a)}
输出结果
API server listening at: 127.0.0.1:49496该结构体有4个字段Field 0:值=张三丰Field 0:tag=nameField 1:值=99Field 1:tag=monster_ageField 2:值=80.5Field 2:tag=成绩Field 3:值=struct has 3 methods----start----{张三丰 99 80.5 }----end----返回的结果 res= 50func该结构体有 3 个方法GetSumSet
