1

我有以下一段代码,我在其中尝试将数组添加到 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但相同的错误。我将如何以惯常的方式做到这一点?

4

2 回答 2

9

MarshalBinary() 方法应该如下

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

注意:信息而不是*信息

于 2020-12-25T13:13:19.550 回答
2

Redis是基于键值对的,键值都是字符串等基于字符串的数据结构。因此,如果你想把一些数据放到redis中,你应该把这些数据字符串做成。

我认为你应该像下面的代码那样实现这个接口,以使 go-redis 能够对你的类型进行字符串化:

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

这样,你实现了这个方法,go-redis 会调用这个方法来对你的数据进行字符串化(或编组)。

于 2021-06-01T04:24:16.027 回答