Получение структуры по ключу из Redis Golang

Имею подобную структуру

type myStruct struct {
    TotalCount    int                      `json:"inventory_total_count"` 
    TotalPrice    int                      `json:"inventory_total_price"` 
    GameList      []string                 `json:"game_list"`             
    UserInfo      UserInformation          `json:"user_info"`             
    GameInventory map[string]InventoryGame `json:"inventory"`          
}

type InventoryGame struct {
    GameAssetsTotalCount int               `json:"game_assets_total_count"` 
    GameAssetsTotalPrice int               `json:"game_assets_total_price"` 
    GameID               string            `json:"gameid"`                  
    Assets               []InventoryAssets `json:"assets"`                  
}

type InventoryAssets struct {
    ClassID          string `json:"classid"`           
    InstanceID       string `json:"instanceid"`        
    IconURL          string `json:"icon_url"`          
    Name             string `json:"name"`              
    MarketHashName   string `json:"market_hash_name"`  
    AssetRarity      string `json:"rarity"`            
    AssetBorderColor string `json:"border_color"`      
    AssetExterior    string `json:"exterior"`          
    AssetQuality     string `json:"asset_quality"`     
    AppID            int    `json:"appid"`             
    AssetPrice       int    `json:"asset_price"`      
    Marketable       int    `json:"marketable"`        
    AssetCount       int    `json:"item_count"`       
    AssetTotalCost   int    `json:"asset_total_price"`
}

после того как ее создаю я, записываю в хранилище Redis следующим образом

err := client.Set(ctx, "key", myStruct, time.Minute)
// отработка err

далее я пытаюсь достать данную структуру следующим образом

newStruct := myStruct{}
err := client.Get(ctx, "key").Scan(&newStruct)
// отработка err

в итоге на выходе получается пустая структура

{0 0 [] {   } map[]}

ps. методы структуры "MarshalBinary" и "UnmarshalBinary" прописаны.

Использую go-redis/v9.

Как мне правильно достать структуру из хранилища редис?


Ответы (2 шт):

Автор решения: WhyNot00

Вопрос решил по своему, почему то такая данный метод у меня не работает:

newStruct := myStruct{}
err := client.Get(ctx, "key").Scan(&newStruct)

Как мне подсказали люди необходимо дампить структуру в JSON самостоятельно и при вызове из кеша десериализовывать данные. Код вынес в отдельные функции.

Код для добавления структуры/JSON в БД.

func RDCSetUser(ctx context.Context, rdc *redis.Client, key string, value interface{}) error {
    b, err := json.Marshal(value)
    if err != nil {
        fmt.Println("Ошибка в джсон")
    }

    return rdc.Set(ctx, key, b, time.Minute*10).Err()
}

Код для получения данных из БД.

func RDCGetUser(ctx context.Context, rdc *redis.Client, key string, dest interface{}) error {
    b, err := rdc.Get(ctx, key).Bytes()
    if err != nil {
        fmt.Println("Ошибка в анджсон")
    }

    return json.Unmarshal(b, dest)
}
→ Ссылка
Автор решения: WhyNot00

Еще раз разобрался библиотека go-redis встроено поддерживает сериализацию/десериализацию, для того чтобы работал данный метод:

newStruct := myStruct{}
err := client.Get(ctx, "key").Scan(&newStruct)

нужно по нормальному прописать маршаллер и анмаршаллер у указанной струкутры

сделать нужно следующим образом:

func (i myStruct) MarshalBinary() ([]byte, error) {
    return json.Marshal(i)
}
func (i *myStruct) UnmarshalBinary(data []byte) error {
    return json.Unmarshal(data, &i)
}
→ Ссылка