- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第
一文带你掌握Golang的反射基础
目录什么是反射go的反射实战reflect包中常用的几个类型和方法
什么是反射
反射的机制是在运行时可以获取到其变量的类型和值,且可以在运行时对其变量类型和值进行检查,可以对其值进行修改。这种机制,其实在编写业务代码时是比较少用到的,那么在框架中,使用的反射的机制是比较常见,如web框架、Orm框架,实现通用性的目的。
go的反射
go的反射是由其标准库中的reflect包实现,该reflect包实现了在运行时进行反射的能力,本篇先讲解一下reflect的常用的几个方法,下篇模拟一些贴近实际的应用场景来剖析到底怎么用。
实战reflect包中常用的几个类型和方法
1.通过反射获取变量的类型(Type)
package?main
import?(
?fmt
?reflect
func?main()?{
?fmt.Println(公众号搜索:不背锅运维)
?a?:=?100.89
?b?:=?hello
?//获取变量a和b的类型,即使用reflect.TypeOf反射出了基本数据类型的变量的类型。
?fmt.Println(reflect.TypeOf(a))?//float64
?fmt.Println(reflect.TypeOf(b))?//string
?//?反射获取结构体类型信息
?type?User?struct?{
??Name?string
??Age??int
?u?:=?User{tantianran,?18}
?fmt.Println(reflect.TypeOf(u))?//main.User
2.使用反射获取变量对应的值(Value)
package?main
import?(
?fmt
?reflect
func?main()?{
?fmt.Println(公众号搜索:不背锅运维)
?a?:=?100.89
?b?:=?hello
?//使用反射获取变量的Value。
?fmt.Println(reflect.ValueOf(a))?//100.89
?fmt.Println(reflect.ValueOf(b))?//hello
?//?使用反射获取结构体变量的Value
?type?User?struct?{
??Name?string
??Age??int
?u?:=?User{tantianran,?18}
?fmt.Println(reflect.ValueOf(u))?//{tantianran?18}
3.TypeOf()方法获取到变量的类型后,再调用它的Kind()方法可以将返回的结果用来进行类型的判断
package?main
import?(
?fmt
?reflect
func?main()?{
?fmt.Println(公众号搜索:不背锅运维)
?a?:=?100.89
?//通过反射获取变量a的类型
?aType?:=?reflect.TypeOf(a)
?fmt.Println(aType)?//float64
?//返回变量a的Type后,调用它的Kind()方法获取该类型的详细信息
?aKind?:=?aType.Kind()
?fmt.Println(aKind)?//float64
?//?Kind()方法返回的结果主要用途是可以用来进行类型判断
?if?aKind?==?reflect.Float64?{?//?使用reflect包里面的数据类型Float64
??fmt.Println(is?float64)
?}?else?{
??fmt.Println(no)
注意,TypeOf()方法是不支持进行类型判断的,如ifaType==reflect.Float64,此时会报错。
4.通过Elem()方法获取变量的指针所指向的对象
注意,先传入变量的地址给ValueOf方法,然后调用Elem()方法获取该变量的指针所指向的对象
package?main
import?(
?fmt
?reflect
func?main()?{
?fmt.Println(公众号搜索:不背锅运维)
?a?:=?100.89
?//?ValueOf传入的是地址,调用Elem()方法可以获取变量的指针指向的对象
?PaValue?:=?reflect.ValueOf(a)?//传入变量a的地址
?fmt.Println(PaValue)?//0xc0000180a0
?aElem?:=?PaValue.Elem()
?fmt.Println(aElem)??//100.89
5.通过反射修改变量的值
方式一:使用具体类型的设置值的方
文档评论(0)