go语言反射mysql golang反射调用方法( 二 )


go语言的reflect(反射)1、反射可以在运行时 动态获取变量的各种信息  , 比如变量的类型、类别;
2、如果是结构体变量 , 还可以获取到结构体本身的信息(包括结构体的字段、方法);
3、通过反射 , 可以修改 变量的值 ,可以调用关联的方法;
4、使用反射 , 需要import " reflect ".
5、示意图:
1、不知道接口调用哪个函数 , 根据传入参数在运行时确定调用的具体接口,这种需要对函数或方法反射 。
例如以下这种桥接模式:
示例第一个参数funcPtr以接口的形式传入函数指针,函数参数args以可变参数的形式传入 , bridge函数中可以用反射来动态执行funcPtr函数 。
1、reflect.TypeOf(变量名),获取变量的类型,返回reflect.Type类型 。
2、reflect.ValueOf(变量名),获取变量的值 , 返回reflect.Value类型reflect.Value是一个结构体类型 。
3、变量、interface{}和reflect.Value是可以互相转换的,这点在实际开发中,会经常使用到 。
1、reflect.Value.Kind , 获取变量的 类别(Kind) ,返回的是一个 常量。在go语言文档中:
示例如下所示:
输出如下:
Kind的范畴要比Type大 。比如有Student和Consumer两个结构体,他们的 Type 分别是 Student 和 Consumer,但是它们的 Kind 都是 struct。
2、Type是类型 , Kind是类别 , Type和Kind可能是相同的,也可能是不同的 。
3、通过反射可以在让 变量 在 interface{} 和 Reflect.Value 之间相互转换,这点在前面画过示意图 。
4、使用反射的方式来获取变量的值(并返回对应的类型),要求数据类型匹配,比如x是int,那么久应该使用reflect.Value(x).Int(),而不能使用其它的,否则报panic 。
如果是x是float类型的话,也是要用reflect.Value(x).Float() 。但是如果是struct类型的话,由于type并不确定,所以没有相应的方法,只能 断言 。
5、通过反射的来修改变量,注意当使用SetXxx方法来设置需要通过对应的指针类型来完成 , 这样才能改变传入的变量的值 , 同时需要使用到reflect.Value.Elem()方法 。
输出num=20,即成功使用反射来修改传进来变量的值 。
6、reflect.Value.Elem()应该如何理解?
如何用Go语言打造一个高性能MySQLProxy读取配置文件并启动,在配置文件中设置的监听端口监听客户端请求 。
收到客户端连接请求后,启动一个goroutine单独处理该请求 。
首选进行登录验证,验证过程完全兼容MySQL认证协议,由于用户名和密码在配置文件中已经设置好,所以可以利用该信息验证连接请求是否合法 。
当用户名和密码都正确时,转入下面的步骤,否则返回出错信息给客户端 。
认证通过后,客户端发送SQL语句 。
kingshard对客户端发送过来的SQL语句,进行词法和语义分析,识别出SQL的类型和生成SQL的路由计划 。如果有必要还会改写SQL,然后转发到相应的DB 。也有可能不做词法和语义分析直接转发到相应的后端DB 。如果转发SQL是分表且跨多个DB,则每个DB对应启动一个goroutine发送SQL和接收该DB返回的结果 。
接收并合并结果,然后转发给客户端 。
【go语言反射mysql golang反射调用方法】go语言反射mysql的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于golang反射调用方法、go语言反射mysql的信息别忘了在本站进行查找喔 。

推荐阅读