Golang中的反射机制

举报
liuzhen007 发表于 2021/05/26 13:48:00 2021/05/26
【摘要】 目录   前言 正文 何为反射? 关键用途 结尾 前言 Golang中也存在反射机制,具体怎么使用呢?先睹为快。 正文 何为反射? 反射就是Golang通过来获取对象的类型信息或者结构信息,再进行访问或者修改的能力。 Golang语言是利用 reflect 关键字进行反射调用的。 一般情况下,Golang声明的变量都包括两部分基...

目录

 

前言

正文

何为反射?

关键用途

结尾


前言

Golang中也存在反射机制,具体怎么使用呢?先睹为快。

正文

何为反射?

反射就是Golang通过来获取对象的类型信息或者结构信息,再进行访问或者修改的能力。

Golang语言是利用 reflect 关键字进行反射调用的。

一般情况下,Golang声明的变量都包括两部分基本内容,一部分是变量类型,比如int、string、bool;另一部分是变量的值,比如0,“123”,true。

在Golang语言中可以通过 reflect.TypeOf() 函数获取任意变量的类型,通过reflect.ValueOf() 函数获取任意变量的值。

下面通过一段代码来理解一下这两个函数的作用。

实例代码:


  
  1. package main
  2. import (
  3. "fmt"
  4. "reflect" // 导入反射包
  5. )
  6. func main() {
  7. str := "Hello, world"
  8. //通过反射获取变量a的type类型
  9. fmt.Println(reflect.TypeOf(str))
  10. //通过反射获取变量a的value类型
  11. fmt.Println(reflect.ValueOf(str))
  12. }

代码运行结果:

string
Hello, world

关键用途

Golang中的反射机制一个重要用途就是修改变量的值。

具体操作是怎么样的呢?

记下来,我们也通过一段代码来简单了解一下。

代码实例:


  
  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. func main() {
  7. // 声明变量a
  8. num := 666
  9. fmt.Printf("a的内存地址为:%p\n", &num)
  10. // 获取变量a的反射类型reflect.Value 的地址
  11. ref := reflect.ValueOf(&num)
  12. fmt.Println("通过反射获取变量a的地址:", ref)
  13. // 获取变量a的地址的值
  14. rval := ref.Elem()
  15. fmt.Println("反射a的值:", rval)
  16. //修改变量a的值
  17. rval.SetInt(888)
  18. fmt.Println("修改之后反射类型的值为:", rval.Int())
  19. //原始值也会被修改
  20. fmt.Println("原始a的值也被修改为:", num)
  21. }

代码运行结果:

a的内存地址为:0xc00007e020
通过反射获取变量a的地址: 0xc00007e020
反射a的值: 666
修改之后反射类型的值为: 888
原始a的值也被修改为: 888

通过上面的小例子,是不是对于Golang利用反射机制修改变量的操作就能够理解了。

结尾

好了,关于Golang的反射机制就介绍这么多,欢迎感兴趣的小伙伴留言交流。

 

文章来源: liuzhen.blog.csdn.net,作者:Data-Mining,版权归原作者所有,如需转载,请联系作者。

原文链接:liuzhen.blog.csdn.net/article/details/115439750

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。