为了账号安全,请及时绑定邮箱和手机立即绑定

从 redis 获取结构数组时解组错误

从 redis 获取结构数组时解组错误

Go
胡子哥哥 2023-07-17 17:09:14
我用来redigo在 redis 中保存一些结构。问题是,对于同一个键,我需要附加新的结构,但是当我尝试恢复它们时,我无法将其解组到数组。即:(故意忽略错误)type ADTO struct {    Value string}func main() {    pool := redis.Pool{        Dial: func() (conn redis.Conn, e error) {            return redis.Dial("tcp", "localhost:6379")        },        MaxIdle:   80,        MaxActive: 12000,    }    conn := pool.Get()    defer conn.Close()    key := "some-key"    defer conn.Do("DEL", key)    a := ADTO{Value: "a"}    bytes, _ := json.Marshal(a)    conn.Do("APPEND", key, bytes)    b := ADTO{Value: "b"}    bytes, _ = json.Marshal(b)    conn.Do("APPEND", key, bytes)    c := ADTO{Value: "c"}    bytes, _ = json.Marshal(c)    conn.Do("APPEND", key, bytes)    bytes, _ = redis.Bytes(conn.Do("GET", key))    adtos := make([]ADTO, 0)    // the following does not work    if err := json.Unmarshal(bytes, &adtos); err != nil {        return    }}如果我只附加一个结构并检索它,那么它工作正常我尝试过redis.ByteSlices但没有运气
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

APPEND 只会附加到字符串,不会生成 JSON 数组。第一次插入后,你会得到


{"Value":"a"}

然后在第二个之后,你就会有


{"Value":"a"}{"Value":"b"}

那不是 JSON 数组。


您可以尝试使用 json.Decoder,并执行以下操作:


b, _ = redis.Bytes(conn.Do("GET", key))

dec := json.NewDecoder(bytes.NewReader(b))

items := []ADTO{}

var x ADTO

for dec.Decode(&x) == nil {

  items = append(items, x)

}


查看完整回答
反对 回复 2023-07-17
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信