golang 的 reflect

目录

虽然我们有了类型断言但是这个有时还是不能满足我们的需求,比如我们不知道传入进来的到底有什么类型,甚至未来还有可能有我们不知道的类型
比如 fmt.Println 函数就是这种情况,这时我们可以使用 golang 的 reflect 来解决这类问题。

例子

package main

import (
  "fmt"
  "reflect"
)

type Stdudent struct {
  Name string `json:"name"`
  Age  int
}

func (s *Stdudent) Get_name() string {
  return s.Name
}

func main() {
  s := Stdudent{"jimila", 20}
  t := reflect.TypeOf(s)
  fmt.Println(t)               // main.Stdudent
  fmt.Println(t.Field(0).Name) // Name
  fmt.Println(t.Field(0).Type) // string
  fmt.Println(t.Field(0).Tag)  // json:"name"
  fmt.Println(t.Name())        // Stdudent

  v := reflect.ValueOf(s)
  fmt.Println(v.Kind())   // struct
  fmt.Println(v.Field(0)) // jimila
  fmt.Println(v.Field(1)) // 20

  //v.MethodByName("Get_name").Call([]reflect.Value{})

  v1 := reflect.ValueOf(&s).MethodByName("Get_name").Call([]reflect.Value{})

  for _, val := range v1 {
    i := val.Interface()
    // 类型断言
    r := i.(string)
    fmt.Println(r) // jimila
  }
}

目录