猿问

无法编组。带有多个对象的 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但相同的错误。我将如何以惯常的方式做到这一点?


慕村9548890
浏览 309回答 2
2回答

不负相思意

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 会调用这个方法来对你的数据进行字符串化(或编组)。
随时随地看视频慕课网APP

相关分类

Go
我要回答