golang反射获取结构体的值和修改值

这篇具有很好参考价值的文章主要介绍了golang反射获取结构体的值和修改值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、代码

package coryCommon

import (
	"context"
	"errors"
	"github.com/gogf/gf/v2/container/gvar"
	"github.com/tiger1103/gfast/v3/internal/app/system/dao"
	"reflect"
)

func New() *coryCom {
	return &coryCom{}
}

type coryCom struct{}

// CreateByOrUpdateBy 专门用来反射结构体中的创建人和更新人,然后返回回去,避免重复造轮子去写重复代码
/**
*使用实例代码
	* by := coryCommon.New().CreateByOrUpdateBy(ctx, res)
	* infoRes := by.(model.BusCompanyInfoRes)
	* res = &infoRes
	*
	*其中 	updateByFieldVal.Set(reflect.ValueOf(updateByValue.Interface().(*gvar.Var).String()))   必须类型一致
*/
func (s *coryCom) CreateByOrUpdateBy(ctx context.Context, data interface{}) (dataRes interface{}) {
	// 使用反射获取 data 的值和类型信息
	val := reflect.ValueOf(data)
	typ := reflect.TypeOf(data)

	// 判断 data 是否为指针类型,并获取实际值
	if val.Kind() == reflect.Ptr {
		val = val.Elem()
		typ = typ.Elem()
	}

	// 获取 createBy 字段在结构体中的索引
	createByField, ok := typ.FieldByName("CreateBy")
	if !ok {
		// 如果结构体中不存在 createBy 字段,则直接返回原始值
		return data
	}
	updateByField, ok := typ.FieldByName("UpdateBy")
	if !ok {
		// 如果结构体中不存在 createBy 字段,则直接返回原始值
		return data
	}

	// 判断 createBy 字段的类型是否为 string
	if createByField.Type.Kind() != reflect.String {
		// 如果 createBy 字段的类型不是 string,请根据需要进行相应的处理或返回错误
		// 此处假设 createBy 必须为 string 类型,如果不是则返回错误
		return errors.New("createBy字段类型不匹配")
	}
	// 判断 updateBy 字段的类型是否为 string
	if updateByField.Type.Kind() != reflect.String {
		// 如果 createBy 字段的类型不是 string,请根据需要进行相应的处理或返回错误
		// 此处假设 createBy 必须为 string 类型,如果不是则返回错误
		return errors.New("updateBy字段类型不匹配")
	}

	// 获取原始的 createBy 字段的值并获取创建人
	createId := val.FieldByIndex(createByField.Index).String()
	value, err := dao.SysUser.Ctx(ctx).Fields("user_name").Where("id", createId).Value()
	if err != nil {
		return errors.New("系统异常,请联系管理员!")
	}
	// 设置 createBy 字段的值为指定参数
	createByValue := reflect.ValueOf(value)
	createByFieldVal := val.FieldByIndex(createByField.Index)
	createByFieldVal.Set(reflect.ValueOf(createByValue.Interface().(*gvar.Var).String()))

	// 获取原始的 createBy 字段的值并获取创建人
	updateId := val.FieldByIndex(updateByField.Index).String()
	value2, err := dao.SysUser.Ctx(ctx).Fields("user_name").Where("id", updateId).Value()
	if err != nil {
		return errors.New("系统异常,请联系管理员!")
	}
	// 设置 createBy 字段的值为指定参数
	updateByValue := reflect.ValueOf(value2)
	updateByFieldVal := val.FieldByIndex(updateByField.Index)
	updateByFieldVal.Set(reflect.ValueOf(updateByValue.Interface().(*gvar.Var).String()))

	// 返回修改后的结构体
	return val.Interface()
}

二、演示

golang反射获取结构体的值和修改值,golang,开发语言,后端
golang反射获取结构体的值和修改值,golang,开发语言,后端
封装好就可以直接在service层使用了【自己手动复制粘贴】
或者嫌麻烦就放到【代码生成器】中,这样就不用每次都去写这个查询了文章来源地址https://www.toymoban.com/news/detail-617848.html

by := coryCommon.New().CreateByOrUpdateBy(ctx, res)
infoRes := by.(model.BusEquipmentEquipmentUnpackingInfoRes)
res = &infoRes

到了这里,关于golang反射获取结构体的值和修改值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包