Сохранить общую структуру в Redis - PullRequest
0 голосов
/ 10 декабря 2018

при написании веб-сервера golang мне пришлось использовать какой-то кеш, поэтому я выбрал redis.Мне была нужна какая-то функция, которая берет любую структуру и сохраняет ее как есть, чтобы перерисовать как значение.Есть ли способ сделать это, не используя interface{} в качестве параметра получения или не повторяя себя слишком много и все еще оставаясь в безопасности типа?

1 Ответ

0 голосов
/ 10 декабря 2018

Кодировать значение структуры в байт [], используя gob , json или аналогичный пакет кодирования.Сохраните байт [] в Redis.Обратный процесс при получении данных.

Если в клиенте Redis есть методы для Set и Get , код с использованием пакета JSON будет выглядеть примерно так:

func set(c *RedisClient, key string, value interface{}) error {
    p, err := json.Marshal(value)
    if err != nil {
       return err
    }
    return c.Set(key, p)
}

func get(c *RedisClient, key string, dest interface{}) error {
    p, err := c.Get(key)
    if err != nil {
       return err
    }
    return json.Unmarshal(p, dest)
}

Используйте это так, чтобы сохранить значение:

var v someType
if err := set(c, key, v); err != nil {
     // handle error
}

и вот так, чтобы получить значение.Обратите внимание, что указатель на значение передается на get.

var v someType
if err := get(c, key, &v); err != nil {
     // handle error
}

Детали необходимо будет корректировать в зависимости от используемого клиента Redis.

Этот подход позволяет избежать повторения иявляется типобезопасным, если приложение устанавливает и получает значения для данного ключа, используя тот же тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...