go语言笔记(反射机制)

go语言笔记(反射机制)

1、定义

  • Go 语言提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法,但是在编译时并不知道这些变量的具体类型,这称为反射机制。
  • 反射的作用:1.在编写不定传参类型函数的时候,或传入类型过多时。2.不确定调用哪个函数,需要根据某些条件来动态执行。

2、反射的实现

  • Go的反射基础是接口和类型系统,Go的反射机制是通过接口来进行的。Go 语言在 reflect
    包里定义了各种类型,实现了反射的各种函数,通过它们可以在运行时检测类型的信息、改变类型的值。

3、反射三定律

  • 反射可以将“接口类型变量”转换为“反射类型对象”。
package main

import (
	"fmt"
	"reflect"
)

func main() {
	var Num float64 = 3.14

	v := reflect.ValueOf(Num)//将接口类型变量转换为反射类型对象v
	t := reflect.TypeOf(Num)//将接口类型变量转换为反射类型对象t

	fmt.Println("Reflect : Num.Value = ", v)
	fmt.Println("Reflect : Num.Type  = ", t)
}
  • 反射可以将“反射类型对象”转换为“接口类型变量”。用interface方法恢复其接口类型的值
package main
import (
    "fmt"
    "reflect"
)
func main() {
    var Num = 3.14
    v := reflect.ValueOf(Num)
    t := reflect.TypeOf(Num)
    fmt.Println(v)
    fmt.Println(t)

    origin := v.Interface().(float64)
    fmt.Println(origin)
}
  • 如果要修改“反射类型对象”,其值必须是“可写的”。通过CanSet函数判断反射对象是否可以修改
package main
import (
    "fmt"
    "reflect"
)
func main() {
    var Num float64 = 3.14
    v := reflect.ValueOf(Num)
    fmt.Println("v的可写性:", v.CanSet())
}
  • 如果反射对象中包含的值是原始值,那么可以通过反射对象修改原始值,如果反射对象中包含的值不是原始值(反射对象包含的是副本值或指向原始值的地址),则该反射对象不可以修改。

4、反射的实践

  • 通过反射修改内容
var f float64 = 3.41
fmt.Println(f)
p := reflect.ValueOf(&f)
v := p.Elem()
v.SetFloat(6.18)
fmt.Println(f)
  • 通过反射调用方法
package main

import (
        "fmt"
        "reflect"
)

func hello() {
  fmt.Println("Hello world!")
}

func main() {
  hl := hello
  fv := reflect.ValueOf(hl)
  fv.Call(nil)//要调用函数的话,可以通过 Value 的 Call() 方法
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值