Невозможно выполнить маршалинг (реализовать кодировку.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