beego代码阅读——反射笔记

本文介绍了一种在Golang中使用反射进行深拷贝的方法,适用于未知类型的指针变量。通过New创建新实例,逐个字段复制值,实现结构体的完全克隆。

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

/*
参数c是个指针,可能指向各种类型的结构体,所以此时无法使用c
所以总体思路就是:新申请一块内存,类型和c一模一样,并且把所需的value都拷贝过来

用反射获取一个未知变量的类型和值 -> 据此New一个新的变量 -> 还原成原始变量(此时是空值)-> 逐个字段把所需值拷贝到新的内存

涉及到的知识点:根据反射获取未知变量的属性,把反射对象还原成原始数据,修改反射类型字段值
参考:https://ehlxr.me/2018/01/26/golang-reflect/
*/

func (p *ControllerRegister) addWithMethodParams(pattern string, c ControllerInterface, methodParams []*param.MethodParam, mappingMethods ...string) {
	//因为c是指针,所以要用Indirect方法获取指针指向的变量类型
	reflectVal := reflect.ValueOf(c)
	t := reflect.Indirect(reflectVal).Type()

	route.initialize = func() ControllerInterface {
		//New()返回的是指针,再把它还原成c,此时已新申请一块内存,类型和c一模一样
		vc := reflect.New(t)
		execController, ok := vc.Interface().(ControllerInterface)

		elemVal := reflect.ValueOf(c).Elem()
		elemType := reflect.TypeOf(c).Elem()
		execElem := reflect.ValueOf(execController).Elem()

		//判断c指向的变量有几个字段,再逐个把所需的拷贝到新的内存里
		numOfFields := elemVal.NumField()
		for i := 0; i < numOfFields; i++ {
			fieldType := elemType.Field(i)
			elemField := execElem.FieldByName(fieldType.Name)
			if elemField.CanSet() {
				fieldVal := elemVal.Field(i)
				elemField.Set(fieldVal)
			}
		}

		//execController就是我们所需的变量
		return execController
	}

	...
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值