Golang反射獲取結(jié)構(gòu)體的值和修改值的代碼示例
功能:根據(jù)id和反射技術(shù)封裝 創(chuàng)建和更新人的查詢(xún)
一、代碼
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 專(zhuān)門(mén)用來(lái)反射結(jié)構(gòu)體中的創(chuàng)建人和更新人,然后返回回去,避免重復(fù)造輪子去寫(xiě)重復(fù)代碼
/**
*使用實(shí)例代碼
* by := coryCommon.New().CreateByOrUpdateBy(ctx, res)
* infoRes := by.(model.BusCompanyInfoRes)
* res = &infoRes
*
*其中 updateByFieldVal.Set(reflect.ValueOf(updateByValue.Interface().(*gvar.Var).String())) 必須類(lèi)型一致
*/
func (s *coryCom) CreateByOrUpdateBy(ctx context.Context, data interface{}) (dataRes interface{}) {
// 使用反射獲取 data 的值和類(lèi)型信息
val := reflect.ValueOf(data)
typ := reflect.TypeOf(data)
// 判斷 data 是否為指針類(lèi)型,并獲取實(shí)際值
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 字段的類(lèi)型是否為 string
if createByField.Type.Kind() != reflect.String {
// 如果 createBy 字段的類(lèi)型不是 string,請(qǐng)根據(jù)需要進(jìn)行相應(yīng)的處理或返回錯(cuò)誤
// 此處假設(shè) createBy 必須為 string 類(lèi)型,如果不是則返回錯(cuò)誤
return errors.New("createBy字段類(lèi)型不匹配")
}
// 判斷 updateBy 字段的類(lèi)型是否為 string
if updateByField.Type.Kind() != reflect.String {
// 如果 createBy 字段的類(lèi)型不是 string,請(qǐng)根據(jù)需要進(jìn)行相應(yīng)的處理或返回錯(cuò)誤
// 此處假設(shè) createBy 必須為 string 類(lèi)型,如果不是則返回錯(cuò)誤
return errors.New("updateBy字段類(lèi)型不匹配")
}
// 獲取原始的 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)異常,請(qǐng)聯(lián)系管理員!")
}
// 設(shè)置 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)異常,請(qǐng)聯(lián)系管理員!")
}
// 設(shè)置 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層使用了【自己手動(dòng)復(fù)制粘貼】
或者嫌麻煩就放到【代碼生成器】中,這樣就不用每次都去寫(xiě)這個(gè)查詢(xún)了
by := coryCommon.New().CreateByOrUpdateBy(ctx, res) infoRes := by.(model.BusEquipmentEquipmentUnpackingInfoRes) res = &infoRes
到此這篇關(guān)于Golang反射獲取結(jié)構(gòu)體的值和修改值的代碼示例的文章就介紹到這了,更多相關(guān)Golang反射獲取結(jié)構(gòu)體值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過(guò)手機(jī)案例理解Go設(shè)計(jì)模式之裝飾器模式的功能屬性
這篇文章主要為大家介紹了Go設(shè)計(jì)模式之裝飾器模式的功能屬性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
解決golang編譯提示dial tcp 172.217.160.113:443: con
這篇文章主要介紹了解決golang編譯提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed,此問(wèn)題完美解決,需要的朋友可以參考下2023-02-02
golang在GRPC中設(shè)置client的超時(shí)時(shí)間
這篇文章主要介紹了golang在GRPC中設(shè)置client的超時(shí)時(shí)間,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
Golang中Bit數(shù)組的實(shí)現(xiàn)方式
這篇文章主要介紹了Golang中Bit數(shù)組的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
Go語(yǔ)言實(shí)戰(zhàn)之詳細(xì)掌握正則表達(dá)式的應(yīng)用與技巧
正則表達(dá)式是一種從左到右與主題字符串匹配的模式,正則表達(dá)式用于替換字符串中的文本,驗(yàn)證表單,基于模式匹配從字符串中提取子字符串等等,這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言實(shí)戰(zhàn)之詳細(xì)掌握正則表達(dá)式的應(yīng)用與技巧,需要的朋友可以參考下2023-12-12
golang 40行代碼實(shí)現(xiàn)通用協(xié)程池
golang協(xié)程機(jī)制很方便的解決了并發(fā)編程的問(wèn)題,但是協(xié)程并不是沒(méi)有開(kāi)銷(xiāo)的,所以也需要適當(dāng)限制一下數(shù)量。這篇文章主要介紹了golang 40行代碼實(shí)現(xiàn)通用協(xié)程池,需要的朋友可以參考下2018-08-08
Golang算法之田忌賽馬問(wèn)題實(shí)現(xiàn)方法分析
這篇文章主要介紹了Golang算法之田忌賽馬問(wèn)題實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了基于Go語(yǔ)言的田忌賽馬問(wèn)題原理與算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-02-02

