Невозможно выполнить маршалинг (реализовать кодировку.BinaryMarshaler). go-redis Sdd с несколькими объектами

У меня есть следующий фрагмент кода, в котором я пытаюсь добавить массив в набор redis, но он выдает ошибку.

package main

import (
    "encoding/json"
    "fmt"

    "github.com/go-redis/redis"
)

type Info struct {
    Name string
    Age  int
}

func (i *Info) MarshalBinary() ([]byte, error) {
    return json.Marshal(i)
}
func main() {
    client := redis.NewClient(&redis.Options{
        Addr:        "localhost:6379",
        Password:    "",
        DB:          0,
        ReadTimeout: -1,
    })

    pong, err := client.Ping().Result()

    fmt.Print(pong, err)

    infos := [2]Info{
        {
            Name: "tom",
            Age:  20,
        },
        {
            Name: "john doe",
            Age:  30,
        },
    }

    pipe := client.Pipeline()
    pipe.Del("testing_set")
    // also tried this
    // pipe.SAdd("testing_set", []interface{}{infos[0], infos[1]})
    pipe.SAdd("testing_set", infos)
    _, err = pipe.Exec()
    fmt.Println(err)
}


Я получаю ошибку can't marshal [2]main.Info (implement encoding.BinaryMarshaler)

Я также попытался преобразовать каждую информацию в []byte и перейти в [][]byte... к SAddно та же ошибка. Как бы я сделал это идоматически?

3 ответа

Метод MarshalBinary() должен быть таким, как показано ниже

      func (i Info) MarshalBinary() ([]byte, error) {
    return json.Marshal(i)
}

примечание: Информация вместо * Информация

Redis основан на парах "ключ-значение", а все "ключи-значения" - это строки и другие строковые структуры данных. Поэтому, если вы хотите поместить некоторые данные в redis, вы должны создать эти строки данных.

Я думаю, вам следует реализовать этот интерфейс, как в приведенном ниже коде, чтобы go-redis мог преобразовать ваш тип в строки:

      func (i Info) MarshalBinary() (data []byte, err error) {
    bytes, err := json.Marshal(u)
    return bytes, err
}

Таким образом, вы реализуете этот метод, и go-redis вызовет этот метод, чтобы структурировать (или упорядочить) ваши данные.

Ответ на исходный вопрос, здесь вам нужно реализовать метод MarshalBinary() для [2]Информация. Я знаю, это немного странно, но именно так нам и нужно это сделать.

Решение

      type Infos [2]Info

func (i Infos) MarshalBinary() ([]byte, error) {
    return json.Marshal(i)
}

обратитесь: https://github.com/redis/go-redis/issues/1554

Другие вопросы по тегам