设为首页 加入收藏

TOP

Golang反射获取变量类型和值(三)
2023-07-23 13:31:30 】 浏览:68
Tags:Golang
1 val:1 key:2 val:2

 

4. 反射的三大定律

反射的两个基础函数定义,

  • 获取类型func TypeOf(i any) Type
  • 获取值func ValueOf(i any) Value

其中,anyinterface{}的别名。

interface{}是不包含任何方法签名的空接口,任何类型都实现了空接口。

A value of interface type can hold any value that implements those methods.

因此,interface{}可以承载任何变量的 (value, concrete type)信息。

 

4.1 从interface到反射对象

interface{}承载变量的(value, concrete type)信息,通过反射暴露方法来访问interface{}的值和类型。

可以简单理解为interface{}的值和信息传递到reflect.Type和 reflect.Value,方便获取。

 

4.2 从反射对象到interface

可以通过函数func (v Value) Interface() (i any)将反射对象转换为interface{}

func ValueOf(i any) Value的反向操作。

func main() {
	a := int32(10)
	valueA := reflect.ValueOf(a)
	fmt.Printf("ValueOf(a):%v\n", valueA)
	fmt.Printf("Interface():%v\n", valueA.Interface())
	ai, ok := valueA.Interface().(int32)
	fmt.Printf("ok:%v val:%v\n", ok, ai)
}

代码输出如下

$ go run main.go
ValueOf(a):10
Interface():10
ok:true val:10

 

4.3 通过反射修改对象,该对象值必须是可修改的

reflect提供func (v Value) CanSet() bool判断对象值是否修改,通过func (v Value) Set(x Value)修改对象值

func main() {
	a := int32(10)
	valueA := reflect.ValueOf(a)
	fmt.Printf("valueA :%v\n", valueA.CanSet())
	b := int32(100)
	valuePtrB := reflect.ValueOf(&b)
	fmt.Printf("valuePtrB:%v Elem:%v\n", valuePtrB.CanSet(), valuePtrB.Elem().CanSet())
	valuePtrB.Elem().Set(reflect.ValueOf(int32(200)))
	fmt.Printf("b:%v Elem:%v\n", b, valuePtrB.Elem())
}

 代码输出如下

$ go run main.go
valueA :false
valuePtrB:false Elem:true
b:200 Elem:200

后续章节再分享通过修改各种类型的值的实操。

 

5. 参考文档

laws-of-reflection

interface

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇「Goravel 上新」用户授权模块,.. 下一篇在线客服系统源码开发实战总结:G..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目