今天看啥  ›  专栏  ›  liuzhen007

Golang中的反射机制|Go主题月

liuzhen007  · 掘金  ·  · 2021-04-05 11:43
阅读 6

Golang中的反射机制|Go主题月

目录

前言

正文

何为反射?

关键用途

结尾

前言

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的反射机制就介绍这么多,欢迎感兴趣的小伙伴留言交流。




原文地址:访问原文地址
快照地址: 访问文章快照