1. /**
    2. package: TracerAnalyze
    3. filename: main
    4. author: diogo
    5. time: 2021/2/19 14:17
    6. **/
    7. package main
    8. import (
    9. "fmt"
    10. "reflect"
    11. )
    12. //定义Monster结构体
    13. type Monster struct {
    14. Name string `json:"name"`
    15. Age int `json:"monster_age"`
    16. Score float32 `json:"成绩"`
    17. Sex string
    18. }
    19. //方法,返回两个数的和
    20. func (s Monster) GetSum(n1, n2 int) int {
    21. return n1 + n2
    22. }
    23. //方法,接受4个值,给s赋值
    24. func (s Monster) Set(name string, age int, score float32, sex string) {
    25. s.Name = name
    26. s.Age = age
    27. s.Score = score
    28. s.Sex = sex
    29. }
    30. //方法,显示s的值
    31. func (s Monster) Print() {
    32. fmt.Println("----start----")
    33. fmt.Println(s)
    34. fmt.Println("----end----")
    35. }
    36. func TestStruct(a interface{}) {
    37. typ := reflect.TypeOf(a)
    38. val := reflect.ValueOf(a) //获取reflect.Type类型
    39. kd := val.Kind() //获取到a对应的类别
    40. if kd != reflect.Struct {
    41. fmt.Println("expect struct")
    42. return
    43. }
    44. //获取到该结构体有几个字段
    45. num := val.NumField()
    46. fmt.Printf("该结构体有%d个字段\n", num) //4个
    47. //遍历结构体的所有字段
    48. for i := 0; i < num; i++ {
    49. fmt.Printf("Field %d:值=%v\n", i, val.Field(i))
    50. //获取到struct标签,需要通过reflect.Type来获取tag标签的值
    51. tagVal := typ.Field(i).Tag.Get("json")
    52. //如果该字段有tag标签就显示,否则就不显示
    53. if tagVal != "" {
    54. fmt.Printf("Field %d:tag=%v\n", i, tagVal)
    55. }
    56. }
    57. //获取到该结构体有多少个方法
    58. numOfMethod := val.NumMethod()
    59. fmt.Printf("struct has %d methods\n", numOfMethod)
    60. //方法的排序默认是按照函数名的顺序(ASCII码)
    61. val.Method(1).Call(nil) //获取到第二个方法,调用它
    62. //调用结构体的第1个方法,Method(0)
    63. var params []reflect.Value
    64. params = append(params, reflect.ValueOf(10))
    65. params = append(params, reflect.ValueOf(40))
    66. //传入的参数是 []reflect.Value,返回 []reflect.Value
    67. res := val.Method(0).Call(params)
    68. //返回结果,返回的结果是 []reflect.Value
    69. fmt.Println("返回的结果 res=", res[0].Int())
    70. fmt.Println(val.Method(1).Kind().String())
    71. //fmt.Println(val.Method(1).Elem())
    72. fmt.Printf("该结构体有 %d 个方法",typ.NumMethod())
    73. fmt.Println(typ.Method(0).Name)
    74. fmt.Println(typ.Method(1).Name)
    75. fmt.Println(typ.Method(2).Name)
    76. //pointer:= reflect.ValueOf(val.Method(1)).Pointer()
    77. //funcName := runtime.FuncForPC(pointer).Name()
    78. //
    79. //fmt.Println(funcName)
    80. //fmt.Println(val.MapKeys())
    81. }
    82. func main() {
    83. //创建一个Monster实例
    84. var a Monster = Monster{
    85. Name: "张三丰",
    86. Age: 99,
    87. Score: 80.5,
    88. }
    89. //将Monster实例传递给TestStruct函数
    90. TestStruct(a)
    91. }

    输出结果

    1. API server listening at: 127.0.0.1:49496
    2. 该结构体有4个字段
    3. Field 0:值=张三丰
    4. Field 0:tag=name
    5. Field 1:值=99
    6. Field 1:tag=monster_age
    7. Field 2:值=80.5
    8. Field 2:tag=成绩
    9. Field 3:值=
    10. struct has 3 methods
    11. ----start----
    12. {张三丰 99 80.5 }
    13. ----end----
    14. 返回的结果 res= 50
    15. func
    16. 该结构体有 3 个方法GetSum
    17. Print
    18. Set