- package main
-
- import (
- "fmt"
- "reflect"
- )
-
- func reflectTest01(b interface{}) {
-
- //通过反射获取变量的type,kind,值
- //1.获取reflect.Type
- rType := reflect.TypeOf(b)
- fmt.Println("rType:=", rType)
-
- //2.获取到reflect.Value,int不能直接参与+-*/
- rVal := reflect.ValueOf(b)
- fmt.Printf("rVal=%v type=%T\n", rVal, rVal)
-
- //3.把reflect.Value能参与基本运算
- n1 := 2 + rVal.Int()
- fmt.Println("n1=", n1)
-
- //将rVal转成interface{}
- iv := rVal.Interface()
- //将interface{}通过断言转成需要的类型
- num2 := iv.(int)
- fmt.Println("num2==", num2)
- }
-
- func reflectTest02(b interface{}) {
- fmt.Println("===============reflectTest02==================")
- rVal := reflect.ValueOf(b)
- fmt.Println("rVal:=", rVal)
- //将interface{}通过断言转成需要的类型
- iv := rVal.Interface()
- fmt.Printf("iv=%v iv type=%T\n", iv, iv)
-
- //将interface{}通过断言转为需要的类型
- stu, ok := iv.(Student)
- if ok {
- fmt.Printf("stu.Name=%v stu.Age=%v\n", stu.Name, stu.Age)
- }
-
- }
-
- type Student struct {
- Name string
- Age int
- }
-
- func main() {
- //1.基本数据类型、interface,reflect.Value进行反射的基本操作
- var num int = 100
- reflectTest01(num)
-
- //2.定义一个Student的实例
- stu := Student{
- Name: "Tom",
- Age: 200,
- }
- reflectTest02(stu)
- }
- =====================reflectTest01==================
- rType:= int
- rVal=100 type=reflect.Value
- n1= 102
- num2== 100
- ==================reflectTest02==================
- rVal:= {Tom 200}
- iv={Tom 200} iv type=main.Student
- stu.Name=Tom stu.Age=200
-
- package main
-
- import (
- "fmt"
- "reflect"
- )
-
- /*
- *
- 通过反射修改
- num int的值
- 修改student的值
- */
- func reflect01(b interface{}) {
- //获取value
- rVal := reflect.ValueOf(b)
- fmt.Printf("rVal kind=%v\n", rVal.Kind())
- rVal.Elem().SetInt(20)
- }
-
- func main() {
- var num int = 100
- reflect01(&num)
- fmt.Println("num=", num)
- }
- rVal kind=ptr
- num = 20
- package main
-
- import (
- "fmt"
- "reflect"
- )
-
- type Monster struct {
- //添加json标签
- Name string `json:"name"`
- Age int `json:"monster_age"`
- Score float32 `json:"成绩"`
- Sex string
- }
-
- // 显示结构体的值
- func (s Monster) Print() {
- fmt.Println("---start---")
- fmt.Println(s)
- fmt.Println("----end----")
- }
-
- // 返回两个数的和
- func (s Monster) GetSum(n1, n2 int) int {
- return n1 + n2
- }
- func (s Monster) Set(name string, age int, score float32, sex string) {
- s.Name = name
- s.Age = age
- s.Score = score
- s.Sex = sex
- }
- func TestStruct(a interface{}) {
- //获取reflect.Type 类型
- tye := reflect.TypeOf(a)
- //获取reflect.value类型
- val := reflect.ValueOf(a)
- //获取a对应的类型
- kd := val.Kind()
-
- if kd != reflect.Struct {
- fmt.Println("expected struct")
- return
- }
- //获取到该结构体有几个字段
- num := val.NumField() //num=4
- fmt.Printf("struct has %d fields\n", num)
-
- //遍历结构体的所有字段
- for i := 0; i < num; i++ {
- fmt.Printf("Field %d: 值为=%v\n", i, val.Field(i))
-
- //获取到struct标签,注意需要通过reflect.Type来获取tag标签的值
- tagVal := tye.Field(i).Tag.Get("json")
- if tagVal != "" {
- fmt.Printf("Field %d: tage为=%v\n", i, tagVal)
- }
- }
-
- //获取到这结构体有多少方法
- numOfMethod := val.NumMethod()
- fmt.Printf("struct has %d methods\n", numOfMethod)
-
- //方法的排序默认是按照函数名的排序(ASC||码)
- val.Method(1).Call(nil)
-
- //调用结构体的GetSum方法
- var params []reflect.Value
- params = append(params, reflect.ValueOf(153))
- params = append(params, reflect.ValueOf(200))
- res := val.Method(0).Call(params) //传入的参数[]reflect.Value,返回的也是[]reflect.Value
- fmt.Println("res=", res[0].Int())
- }
- func main() {
- var a Monster = Monster{
- Name: "K神",
- Age: 500,
- Score: 40.5,
- }
- TestStruct(a)
- }
- struct has 4 fields
- Field 0: 值为=K神
- Field 0: tage为=name
- Field 1: 值为=500
- Field 1: tage为=monster_age
- Field 2: 值为=40.5
- Field 2: tage为=成绩
- Field 3: 值为=
- struct has 3 methods
- ---start---
- {K神 500 40.5 }
- ----end----
- res= 353