go語言的go-redis/redis v8庫在存儲(chǔ)復(fù)雜數(shù)據(jù)結(jié)構(gòu)(如數(shù)組)時(shí),需要進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。本文將講解如何利用該庫高效存儲(chǔ)和讀取Go語言數(shù)組,并解決getmenutree函數(shù)中遇到的問題。
getmenutree函數(shù)旨在獲取并存儲(chǔ)動(dòng)態(tài)菜單樹到redis。GetMenuTreeMap函數(shù)獲取菜單樹數(shù)據(jù)(假設(shè)為[]model.sysrolemenu類型的數(shù)組),但直接使用global.gva_redis.Set方法存儲(chǔ)會(huì)報(bào)錯(cuò),因?yàn)樵摲椒▋H支持字符串類型。
解決方法是將[]model.sysrolemenu數(shù)組轉(zhuǎn)換成Redis可識(shí)別的json字符串。 利用encoding/json包,可以將數(shù)組序列化為JSON字符串,再存儲(chǔ)到Redis。讀取數(shù)據(jù)時(shí),則反序列化回[]model.sysrolemenu數(shù)組。
以下示例代碼演示了該過程(假設(shè)model.sysrolemenu結(jié)構(gòu)體已定義):
立即學(xué)習(xí)“go語言免費(fèi)學(xué)習(xí)筆記(深入)”;
import ( "context" "encoding/json" "github.com/go-redis/redis/v8" "go.uber.org/zap" ) // ... 其他代碼 ... func GetMenuTree(ctx context.Context, roleId string) (err error, menus []model.SysRoleMenu) { err, menuTree := GetMenuTreeMap(ctx, roleId) //假設(shè)GetMenuTreeMap也接受context menus = menuTree["0"] data, err := json.Marshal(menus) if err != nil { zap.L().Error("json marshal error", zap.Error(err)) return err, nil } err = global.gvaRedis.Set(ctx, "menuTree:"+roleId, string(data), 0).Err() // 使用ctx if err != nil { zap.L().Error("redis set error", zap.Error(err)) return err, nil } return nil, menus } func GetMenuTreeFromRedis(ctx context.Context, roleId string) (err error, menus []model.sysrolemenu) { result := global.gvaRedis.Get(ctx, "menuTree:"+roleId) // 使用ctx val, err := result.Result() if err != nil { if err == redis.Nil { return nil, nil // Redis中不存在數(shù)據(jù) } zap.L().Error("redis get error", zap.Error(err)) return err, nil } err = json.Unmarshal([]byte(val), &menus) if err != nil { zap.L().Error("json unmarshal error", zap.Error(err)) return err, nil } return nil, menus }
此代碼使用了json.Marshal將數(shù)組序列化為JSON字符串,并使用global.gvaRedis.Set存儲(chǔ)到Redis。GetMenuTreeFromRedis函數(shù)則演示了如何從Redis讀取數(shù)據(jù)并使用json.Unmarshal進(jìn)行反序列化。 代碼中增加了錯(cuò)誤處理和對(duì)redis.Nil的判斷,提高了代碼的健壯性。 同時(shí),建議將context.Context傳遞給函數(shù),以便更好地管理資源和取消操作。
通過JSON編碼和解碼,可以有效地將Go語言數(shù)組存儲(chǔ)到go-redis/redis v8庫中。 記住在讀取數(shù)據(jù)時(shí)也需要進(jìn)行相應(yīng)的JSON解碼操作。