Go语言反射机制

本文详细介绍了Go语言的反射机制,包括对值的反射、结构体的反射、调用方法和字段,以及如何通过字符串调用方法。通过实例展示了如何获取类型、值、结构体字段及方法,并进行操作。强调了`type`和`kind`的区别,以及在实际编程中反射的应用场景,如RPC注册和方法动态调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Go语言反射机制

一、对值的反射

package main

import (
	"fmt"
	"reflect"
)

func reflectVal(i interface{}) {
	te := reflect.TypeOf(i)
	fmt.Println(te) //获得数据类型,注意:这里获得的变量的类型是reflect变量类型,需要和interface转换,需要使用类型断言
	val := reflect.ValueOf(i)
	fmt.Println(val)        //获取参数的值
	val1 := val.Interface() //转换为Interface函数
	fmt.Printf("%T\n", val1)
	n := 3 + val1.(int) // 使用类型断言让计算成立
	fmt.Println("转换后获得的值为:", n)
}
func main() {
	var i int = 10
	reflectVal(i)

}

二、对结构体的反射

package main

import (
	"fmt"
	"reflect"
)

type Student struct {
	Id   int
	Name string
	Age  int
}

func reflectStruct(b interface{}) {
	te := reflect.TypeOf(b) //获取类型
	fmt.Println(te)
	val := reflect.ValueOf(b) //获取结构体的值
	fmt.Println(val)
	val1 := val.Interface() //转化为接口类型
	stu := val1.(Student)   //通过类型断言将空接口转换为Student结构体
	fmt.Println(stu.Name)   //输出学生名字
}
func main() {
	stu := Student{
		Id:   1,
		Name: "Yang",
		Age:  12,
	}
	reflectStruct(stu)
}

注意type和kind的区别,type更加细致,精确到那个函数,kind只是类别

三、调用方法和字段

package main

import (
	"fmt"
	"reflect"
)

type Student struct {
	Id   int
	Name string
	Age  int
}

func (stu Student) Rm() {
	fmt.Println("Get This Method")
}
func (stu Student) Rm1() {
	fmt.Println("Get This Method1")
}
func reflectStruct(b interface{}) {
	te := reflect.TypeOf(b)
	fmt.Println(te)
	val := reflect.ValueOf(b)
	kd := val.Kind() //获取结构体的类别
	if kd != reflect.Struct {
		return
	} //判断是否为结构体
	n := val.NumField() //获取结构体字段
	fmt.Println("结构体的字段有", n)
	for i := 0; i < n; i++ {
		fmt.Printf("输出第%d个字段值为%v\n", i, val.Field(i))
	} //遍历输出所有的字段
	numMethod := val.NumMethod() //获取结构体的所有方法
	fmt.Println(numMethod)
	val.Method(0).Call(nil) //调用第一个的方法

}

func main() {
	stu := Student{
		Id:   1,
		Name: "Yang",
		Age:  12,
	}
	reflectStruct(stu)
}

四、通过字符串调用方法

1、RPC注册

后续讲解

2、反射

package main

import (
	"fmt"
	"reflect"
)

type Student struct {
	Id   int
	Name string
	Age  int
}

func (this *Student) Talk() {
	fmt.Println("I'm a Student")
}

func main() {
	stu := &Student{
		Id:   1,
		Name: "yang",
		Age:  12,
	}
	val := reflect.ValueOf(stu)
	method := val.MethodByName("Talk") //判断是否有这个方法
	method.Call(nil)
}

如果看完对自己有所帮助,请点赞支持

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值