基本介绍

  1. unc (v Value) NumMethod() int

返回v持有值的方法集的方法数目

  1. func (v Value) NumField() int

返回v持有的结构体类型值的字段数,如果v的Kind不是Struct会panic

  1. func (v Value) Call(in []Value) []Value

Call方法使用输入的参数in调用v持有的函数。例如,如果len(in) == 3v.Call(in)代表调用v(in[0], in[1], in[2])(其中Value值表示其持有值)。如果v的Kind不是Func会panic。它返回函数所有输出结果的Value封装的切片。和go代码一样,每一个输入实参的持有值都必须可以直接赋值给函数对应输入参数的类型。如果v持有值是可变参数函数,Call方法会自行创建一个代表可变参数的切片,将对应可变参数的值都拷贝到里面。

结构体类型反射代码

  1. // 结构体 反射 案例
  2. // 反射可以用来开发底层框架
  3. package main
  4. import (
  5. "fmt"
  6. "reflect"
  7. )
  8. // 这就需要通过 tag 来转化大写的字段,同时又保证内部调用的时候可以暴露变量
  9. // 反射原理
  10. type People struct {
  11. Name string `json:"name01"`
  12. Age int `json:"age"`
  13. Height float64 `json:"height"`
  14. Action string
  15. }
  16. // 给结构体绑定方法
  17. func (p People) Print() {
  18. fmt.Println("print() = ", p)
  19. }
  20. func (p People) GetSum(n1, n2 int) int {
  21. return n1 + n2
  22. }
  23. func (p People) Set(name string, age int, height float64, action string) {
  24. p.Name = name
  25. p.Age = age
  26. p.Height = height
  27. p.Action = action
  28. }
  29. func TestStruct(a interface{}) {
  30. typ := reflect.TypeOf(a)
  31. val := reflect.ValueOf(a)
  32. kd := val.Kind()
  33. if kd != reflect.Struct {
  34. fmt.Println("except struct, but its not")
  35. return
  36. }
  37. // 结构体字段
  38. num := val.NumField()
  39. fmt.Printf("struct has %v fields \n", num)
  40. for i := 0; i < num; i++ {
  41. fmt.Printf("第%v个字段:%v \n", i+1, val.Field(i))
  42. tagVal := typ.Field(i).Tag.Get("json")
  43. if tagVal != "" {
  44. fmt.Printf("第%v个字段, tag : %v \n", i+1, tagVal)
  45. }
  46. }
  47. // 结构体方法
  48. numOfMethod := val.NumMethod()
  49. fmt.Printf("struct 有 %v 个方法 \n", numOfMethod)
  50. val.Method(1).Call(nil)
  51. var params []reflect.Value
  52. params = append(params, reflect.ValueOf(10))
  53. params = append(params, reflect.ValueOf(40))
  54. res := val.Method(0).Call(params)
  55. fmt.Println("res = ", res[0].Int())
  56. }
  57. func main() {
  58. // struct
  59. p1 := People{
  60. Name: "tom",
  61. Age: 18,
  62. Height: 178.5,
  63. Action: "衣食住行",
  64. }
  65. TestStruct(p1)
  66. }