欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang反射獲取結(jié)構(gòu)體的值和修改值的代碼示例

 更新時間:2023年08月01日 10:13:49   作者:攬月隨風醉  
這篇文章主要給大家介紹了golang反射獲取結(jié)構(gòu)體的值和修改值的代碼示例及演示效果,對我們的學習或工作有一定的幫助,感興趣的同學可以參考閱讀本文

功能:根據(jù)id和反射技術封裝 創(chuàng)建和更新人的查詢

一、代碼

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 專門用來反射結(jié)構(gòu)體中的創(chuàng)建人和更新人,然后返回回去,避免重復造輪子去寫重復代碼
/**
*使用實例代碼
	* 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 字段在結(jié)構(gòu)體中的索引
	createByField, ok := typ.FieldByName("CreateBy")
	if !ok {
		// 如果結(jié)構(gòu)體中不存在 createBy 字段,則直接返回原始值
		return data
	}
	updateByField, ok := typ.FieldByName("UpdateBy")
	if !ok {
		// 如果結(jié)構(gòu)體中不存在 createBy 字段,則直接返回原始值
		return data
	}
	// 判斷 createBy 字段的類型是否為 string
	if createByField.Type.Kind() != reflect.String {
		// 如果 createBy 字段的類型不是 string,請根據(jù)需要進行相應的處理或返回錯誤
		// 此處假設 createBy 必須為 string 類型,如果不是則返回錯誤
		return errors.New("createBy字段類型不匹配")
	}
	// 判斷 updateBy 字段的類型是否為 string
	if updateByField.Type.Kind() != reflect.String {
		// 如果 createBy 字段的類型不是 string,請根據(jù)需要進行相應的處理或返回錯誤
		// 此處假設 createBy 必須為 string 類型,如果不是則返回錯誤
		return errors.New("updateBy字段類型不匹配")
	}
	// 獲取原始的 createBy 字段的值并獲取創(chuàng)建人
	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("系統(tǒng)異常,請聯(lián)系管理員!")
	}
	// 設置 createBy 字段的值為指定參數(shù)
	createByValue := reflect.ValueOf(value)
	createByFieldVal := val.FieldByIndex(createByField.Index)
	createByFieldVal.Set(reflect.ValueOf(createByValue.Interface().(*gvar.Var).String()))
	// 獲取原始的 createBy 字段的值并獲取創(chuàng)建人
	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("系統(tǒng)異常,請聯(lián)系管理員!")
	}
	// 設置 createBy 字段的值為指定參數(shù)
	updateByValue := reflect.ValueOf(value2)
	updateByFieldVal := val.FieldByIndex(updateByField.Index)
	updateByFieldVal.Set(reflect.ValueOf(updateByValue.Interface().(*gvar.Var).String()))
	// 返回修改后的結(jié)構(gòu)體
	return val.Interface()
}

二、演示

封裝好就可以直接在service層使用了【自己手動復制粘貼】
或者嫌麻煩就放到【代碼生成器】中,這樣就不用每次都去寫這個查詢了

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

到此這篇關于Golang反射獲取結(jié)構(gòu)體的值和修改值的代碼示例的文章就介紹到這了,更多相關Golang反射獲取結(jié)構(gòu)體值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 通過手機案例理解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數(shù)組的實現(xiàn)方式

    Golang中Bit數(shù)組的實現(xiàn)方式

    這篇文章主要介紹了Golang中Bit數(shù)組的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言實戰(zhàn)之詳細掌握正則表達式的應用與技巧

    Go語言實戰(zhàn)之詳細掌握正則表達式的應用與技巧

    正則表達式是一種從左到右與主題字符串匹配的模式,正則表達式用于替換字符串中的文本,驗證表單,基于模式匹配從字符串中提取子字符串等等,這篇文章主要給大家介紹了關于Go語言實戰(zhàn)之詳細掌握正則表達式的應用與技巧,需要的朋友可以參考下
    2023-12-12
  • Go map定義的方式及修改技巧

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

    這篇文章主要給大家介紹了關于Go map定義的方式及修改技巧,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • golang 40行代碼實現(xiàn)通用協(xié)程池

    golang 40行代碼實現(xiàn)通用協(xié)程池

    golang協(xié)程機制很方便的解決了并發(fā)編程的問題,但是協(xié)程并不是沒有開銷的,所以也需要適當限制一下數(shù)量。這篇文章主要介紹了golang 40行代碼實現(xiàn)通用協(xié)程池,需要的朋友可以參考下
    2018-08-08
  • Golang算法之田忌賽馬問題實現(xiàn)方法分析

    Golang算法之田忌賽馬問題實現(xiàn)方法分析

    這篇文章主要介紹了Golang算法之田忌賽馬問題實現(xiàn)方法,結(jié)合具體實例形式分析了基于Go語言的田忌賽馬問題原理與算法實現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02
  • 一文帶你掌握go中的異常處理

    一文帶你掌握go中的異常處理

    代碼在執(zhí)行的過程中可能因為一些邏輯上的問題而出現(xiàn)錯誤,我們稱之為異常,那么如何處理這些異常呢,下面小編就來和大家詳細聊聊golang中的異常處理機制吧
    2023-09-09
  • Golang中的同步工具sync.WaitGroup詳解

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

    這篇文章主要詳細為大家介紹了Golang中的同步工具sync.WaitGroup,文中有詳細的代碼示例,具有很好的參考價值,希望對大家有所幫助,一起跟隨小編過來看看吧
    2023-05-05

最新評論