首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法封送,(实现encoding.BinaryMarshaler)。带有多个对象的go-redis Sdd

无法封送,(实现encoding.BinaryMarshaler)。带有多个对象的go-redis Sdd
EN

Stack Overflow用户
提问于 2020-03-30 14:34:08
回答 2查看 6K关注 0票数 0

我有一段代码,在这段代码中,我试图将一个数组添加到redis集合中,但它给了我一个错误。

代码语言:javascript
复制
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,但发生了相同的错误。我该如何从神学上做到这一点呢?

EN

回答 2

Stack Overflow用户

发布于 2020-12-25 21:13:20

MarshalBinary()方法如下所示

代码语言:javascript
复制
func (i Info) MarshalBinary() ([]byte, error) {
    return json.Marshal(i)
}

注意:信息而不是*信息

票数 7
EN

Stack Overflow用户

发布于 2021-06-01 12:24:16

Redis基于键值对,键值都是字符串和其他基于字符串的数据结构。因此,如果您想要将一些数据放入redis中,您应该将这些数据字符串。

我认为你应该像下面的代码一样实现这个接口,让go-redis能够字符串你的类型:

代码语言:javascript
复制
func (i Info) MarshalBinary() (data []byte, err error) {
    bytes, err := json.Marshal(u)
    return bytes, err
}

通过这种方式,您实现了此方法,go-redis将调用此方法来对您的数据进行字符串化(或编组)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60925203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档