golang反射机制

voidFan · · 587 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

反射

  • 反射就是程序能够在运行时动态的查看变量自己的所有属性和方法,能够调用他的任意方法和属性。
  • GO的反射基础是接口和类型系统。
  • 反射的优缺点:(优)简化代码、(缺)性能损失、难懂、脆弱

反射三定律

  1. 反射可以从接口值得到反射对象;
  2. 反射可以从反射对象获取接口值。
  3. 若要修改一个反射对象,则其值必须为可以修改。
package main
import (
    "fmt"
    "reflect"
)
type User struct {
    Id int
    Name string
    Age int
}
func (u User) ReflectCallFunc(s string) {
    fmt.Println("test ok ", s)
}
func Do(input interface{}) {
    getType := reflect.TypeOf(input)  //TypeOf获取变量的类型。如:int、string、struct
    fmt.Println("get Type is:", getType.Name())
    getValue := reflect.ValueOf(input) //ValueOf获取变量的值,结构体上绑定的函数属于<值>
    fmt.Println("get all fields is :", getValue)

    // 获取方法字段
    // 1. 先获取interface的reflect.Type,然后通过NumField进行遍历
    // 2. 再通过reflect.Type的Field获取其Field
    // 3. 最后通过Field的Interface()得到对应的value
    for i:=0; i<getType.NumField(); i++ {
        field := getType.Field(i)
        value := getValue.Field(i)
        fmt.Printf("%s:%v = %v\n", field.Name, field.Type, value)
    }

    // 获取方法
    // 1. 先获取interface的reflect.Type,然后通过.NumMethod进行遍历
    for i:=0; i<getType.NumMethod();i++ {
        m := getType.Method(i)
        fmt.Printf("%s:%v\n", m.Name, m.Type)
    }
    // 2. 直接调用方法[使用reflect.ValueOf()来调用函数]
    methodValue := getValue.MethodByName("ReflectCallFunc")
    //args := make([]reflect.Value, 0)
    args := []reflect.Value{reflect.ValueOf("Done")}
    methodValue.Call(args)
}

func main() {
    user := User{1, "Fan", 30}
    Do(user)
}
//get Type is: User
//get all fields is : {1 Fan 30}
//Id:int = 1
//Name:string = Fan
//Age:int = 30
//ReflectCallFunc:func(main.User, string)
//test ok  Done

反射应用场景

  • Golang的gRPC也是通过反射实现的。
  • 控制反转,依赖注入
  • GO中的类型断言:判断接口型变量运行时的实际类型
  • GIN参数校验

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:voidFan

查看原文:golang反射机制

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

587 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传