前言
Golang中也存在反射机制,具体怎么使用呢?先睹为快。
正文
何为反射?
反射就是Golang通过来获取对象的类型信息或者结构信息,再进行访问或者修改的能力。
Golang语言是利用 reflect 关键字进行反射调用的。
一般情况下,Golang声明的变量都包括两部分基本内容,一部分是变量类型,比如int、string、bool;另一部分是变量的值,比如0,“123”,true。
在Golang语言中可以通过 reflect.TypeOf() 函数获取任意变量的类型,通过reflect.ValueOf() 函数获取任意变量的值。
下面通过一段代码来理解一下这两个函数的作用。
实例代码:
package main
import (
"fmt"
"reflect" // 导入反射包
)
func main() {
str := "Hello, world"
//通过反射获取变量a的type类型
fmt.Println(reflect.TypeOf(str))
//通过反射获取变量a的value类型
fmt.Println(reflect.ValueOf(str))
}
代码运行结果:
string
Hello, world
关键用途
Golang中的反射机制一个重要用途就是修改变量的值。
具体操作是怎么样的呢?
记下来,我们也通过一段代码来简单了解一下。
代码实例:
package main
import (
"fmt"
"reflect"
)
func main() {
// 声明变量a
num := 666
fmt.Printf("a的内存地址为:%p\n", &num)
// 获取变量a的反射类型reflect.Value 的地址
ref := reflect.ValueOf(&num)
fmt.Println("通过反射获取变量a的地址:", ref)
// 获取变量a的地址的值
rval := ref.Elem()
fmt.Println("反射a的值:", rval)
//修改变量a的值
rval.SetInt(888)
fmt.Println("修改之后反射类型的值为:", rval.Int())
//原始值也会被修改
fmt.Println("原始a的值也被修改为:", num)
}
代码运行结果:
a的内存地址为:0xc00007e020
通过反射获取变量a的地址: 0xc00007e020
反射a的值: 666
修改之后反射类型的值为: 888
原始a的值也被修改为: 888
通过上面的小例子,是不是对于Golang利用反射机制修改变量的操作就能够理解了。
结尾
好了,关于Golang的反射机制就介绍这么多。