44. Go 语言中的反射

目录
文章目录隐藏
  1. 1. 通过反射获取类型
  2. 2. 通过反射获取值
  3. 3. 通过反射修改变量值
  4. 4. 小结

反射是在 java 出现后迅速流行起来的一种概念,通过反射可以获取丰富的类型信息,并可以利用这些类型信息做非常灵活的工作。大多数现代的高级语言都以各种形式支持反射功能,反射是把双刃剑,功能强大但代码可读性并不理想,若非必要并不推荐使用反射。本文就来介绍一下反射在 Go 语言中的基本使用方法。

1. 通过反射获取类型

在 Go 语言中提供反射的包为 reflect,其中reflect.Type()函数可以获取一个变量的类型。

代码示例:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    test := 10
    typeOfTest := reflect.TypeOf(test)
    fmt.Println("变量 test 的类型:", typeOfTest)
}
  • 第 9 行:定义一个值为 10 的变量;
  • 第 10 行:通过反射获取变量的类型。

执行结果:

go 通过反射获取类型

2. 通过反射获取值

其中 reflect.ValueOf() 函数可以获取一个变量的值。

代码示例:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    test := 10
    ValueOfTest := reflect.ValueOf(test)
    fmt.Println("变量 test 的值:", ValueOfTest)
}
  • 第 9 行:定义一个值为 10 的变量;
  • 第 10 行:通过反射获取变量的值。

执行结果:

go 通过反射获取值

3. 通过反射修改变量值

上文中我们了解了两个反射中常用的函数,接下来,我们来学习下如何使用反射来进行一些灵活的操作,比如修改变量的值。

代码示例:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    test := 10
    //获取 test 变量的地址
    ValueOfTestAddr := reflect.ValueOf(&test)
    //获取地址存放的值
    ValueOfTest := ValueOfTestAddr.Elem()
    //修改这个值
    ValueOfTest.SetInt(100)
    fmt.Println("变量 test 的值:", test)
}

执行结果:

go 通过反射修改变量值

使用上述操作,我们就可以在一些情况下操作其它包中的私有变量,这种操作是十分危险的,所以如非必要尽量不要使用。

4. 小结

本文主要是简单的介绍了以下 Go 语言中的反射的用法。虽然反射的功能强大,但是由于使用的风险比较高,而且对程序的设计会有破坏,所以建议非必要尽量就不要使用了。反射是在 java 出现后迅速流行起来的一种概念,通过反射可以获取丰富的类型信息,并可以利用这些类型信息做非常灵活的工作。大多数现代的高级语言都以各种形式支持反射功能,反射是把双刃剑,功能强大但代码可读性并不理想,若非必要并不推荐使用反射。

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系maynote@foxmail.com处理
码云笔记 » 44. Go 语言中的反射

发表回复