Golang反射获取结构体的值和修改值的代码示例

 更新时间:2023年08月01日 10:13:49   作者:揽月随风醉  
这篇文章主要给大家介绍了golang反射获取结构体的值和修改值的代码示例及演示效果,对我们的学习或工作有一定的帮助,感兴趣的同学可以参考阅读本文

功能:根据id和反射技术封装 创建和更新人的查询

一、代码

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()
}

二、演示

封装好就可以直接在service层使用了【自己手动复制粘贴】
或者嫌麻烦就放到【代码生成器】中,这样就不用每次都去写这个查询了

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

到此这篇关于Golang反射获取结构体的值和修改值的代码示例的文章就介绍到这了,更多相关Golang反射获取结构体值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 通过手机案例理解Go设计模式之装饰器模式的功能属性

    通过手机案例理解Go设计模式之装饰器模式的功能属性

    这篇文章主要为大家介绍了Go设计模式之装饰器模式的功能属性,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 解决golang编译提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed(推荐)

    解决golang编译提示dial tcp 172.217.160.113:443: con

    这篇文章主要介绍了解决golang编译提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed,此问题完美解决,需要的朋友可以参考下
    2023-02-02
  • golang在GRPC中设置client的超时时间

    golang在GRPC中设置client的超时时间

    这篇文章主要介绍了golang在GRPC中设置client的超时时间,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Golang中Bit数组的实现方式

    Golang中Bit数组的实现方式

    这篇文章主要介绍了Golang中Bit数组的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go语言实战之详细掌握正则表达式的应用与技巧

    Go语言实战之详细掌握正则表达式的应用与技巧

    正则表达式是一种从左到右与主题字符串匹配的模式,正则表达式用于替换字符串中的文本,验证表单,基于模式匹配从字符串中提取子字符串等等,这篇文章主要给大家介绍了关于Go语言实战之详细掌握正则表达式的应用与技巧,需要的朋友可以参考下
    2023-12-12
  • Go map定义的方式及修改技巧

    Go map定义的方式及修改技巧

    这篇文章主要给大家介绍了关于Go map定义的方式及修改技巧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • golang 40行代码实现通用协程池

    golang 40行代码实现通用协程池

    golang协程机制很方便的解决了并发编程的问题,但是协程并不是没有开销的,所以也需要适当限制一下数量。这篇文章主要介绍了golang 40行代码实现通用协程池,需要的朋友可以参考下
    2018-08-08
  • Golang算法之田忌赛马问题实现方法分析

    Golang算法之田忌赛马问题实现方法分析

    这篇文章主要介绍了Golang算法之田忌赛马问题实现方法,结合具体实例形式分析了基于Go语言的田忌赛马问题原理与算法实现技巧,需要的朋友可以参考下
    2017-02-02
  • 一文带你掌握go中的异常处理

    一文带你掌握go中的异常处理

    代码在执行的过程中可能因为一些逻辑上的问题而出现错误,我们称之为异常,那么如何处理这些异常呢,下面小编就来和大家详细聊聊golang中的异常处理机制吧
    2023-09-09
  • Golang中的同步工具sync.WaitGroup详解

    Golang中的同步工具sync.WaitGroup详解

    这篇文章主要详细为大家介绍了Golang中的同步工具sync.WaitGroup,文中有详细的代码示例,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧
    2023-05-05

最新评论