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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決golang編譯提示dial tcp 172.217.160.113:443: con
這篇文章主要介紹了解決golang編譯提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed,此問題完美解決,需要的朋友可以參考下2023-02-02golang 40行代碼實現(xiàn)通用協(xié)程池
golang協(xié)程機制很方便的解決了并發(fā)編程的問題,但是協(xié)程并不是沒有開銷的,所以也需要適當限制一下數(shù)量。這篇文章主要介紹了golang 40行代碼實現(xiàn)通用協(xié)程池,需要的朋友可以參考下2018-08-08