Golang基础6-反射

反射

参考链接:Go 语言反射的实现原理 | Go 语言设计与实现

Go语言基础之反射 | 李文周的博客

https://juejin.cn/post/6844904177009688589

在程序运行期间对程序本身进行访问和修改的能力,程序在编译时,变量转换为内存地址,变量名不会写入到可执行部分,程序无法获取自身信息

支持反射语言可以在编译期间的变量的反射信息,如字段名称、类型信息、结构体信息整合到可执行文件当中,并提供接口供访问,这样在程序运行期间可以获取反射信息并可以修改。

reflect

反射中两对重要的函数和类型

函数:

    • reflect.TypeOf 能获取类型信息;
    • reflect.ValueOf 能获取数据的运行时表示;

类型:reflect.Type reflect.Value这是两个接口

通过TypeOf,ValueOf转换为Type,Value接口,之后就可以进行复杂操作

三大法则:

  • Reflection goes from interface value to reflection object.
  • Reflection goes from reflection object to interface value.
  • To modify a reflection object, the value must be settable.

翻译一下,就是:

  • 反射可以将接口类型变量 转换为“反射类型对象”;
  • 反射可以将 “反射类型对象”转换为 接口类型变量;
  • 如果要修改 “反射类型对象” 其类型必须是 可写的;
简单demo

法则1:将接口类型变量 转换为“反射类型对象”;

因为TypeOf,ValueOf的形参类型是interface{},所以实参任何值都会隐式转换为接口。

法则2:将"反射类型对象"转换为接口;

其中调用Interface()方法,并且只能返回reflect.Value这个类型。

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var author interface{}
    author = "张三"
    //type类型,value
    //法则1:从接口到反射对象
    t := reflect.TypeOf(author)
    v := reflect.ValueOf(author)
    fmt.Printf("接口到反射对象:t:%v typeof(t):%T\n", t, t)
    fmt.Printf("接口到反射对象:v:%v typeof(v):%T\n", v, v)

    //法则2:反射可以将 “反射类型对象”转换为 接口类型变量
    //其中调用Interface()方法,转回
    i := v.Interface()
    fmt.Printf("反射对象到接口 %T %v\n", i, i)

    i = "李四"
    fmt.Printf("%p\n", &author)
    fmt.Printf("%p\n", &i)
}

第三定律:要修改 “反射类型对象” 其类型必须是 可写的;

reflect.ValueOf如果接收变量,则canSet()可写性false

如果canSet()不可写,但仍修改对象,则报错

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var name string = "Go编程时光"
    fmt.Println("真实世界里 name 的原始值为:", name)

    v1 := reflect.ValueOf(&name)
    v2 := v1.Elem()

    v2.SetString("Python编程时光")
    fmt.Println("通过反射对象进行更新后,真实世界里 name 变为:", name)
}

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值