- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用“RPUSH”命令将我的对象推送到我的 redis 库中。
// object is of type interface
var network bytes.Buffer
gob.NewEncoder(&network)
enc.Encode(object /* interface{} */)
redis.String(d.Conn.Do("RPUSH", "objects", network.String()))
Redigo 做了我期待的事情,它正在插入所有数据结构的 gob 编码。
现在我正在尝试检索它们:
sall, _ := redis.Strings(d.Conn.Do("LRANGE", "todos", "0", "-1"))
fmt.Printf("%T", sall) // type []string as expected
// At this point, I have no idea if I should store the data in a buffer, or convert it directly as bytes. actually, here I'm lost
var network bytes.Buffer
var object []interface{}
dec := gob.NewDecoder(network)
err := dec.Decode(inout)
fmt.Printf("%v", err) // decode error:EOF
对它们进行 gob 解码的最佳方法是什么?我想将它们作为接口(interface) {} 的一部分取回。但即使我的对象被编码为 gob 数据。都是redis方式推送的,那么从gob的角度看能不能算作一个 slice ?
我可以迭代其他列表并一一解码。但是我对效率没有信心。我假设 gob 想要一个以其方式编码的 slice 结构。所以我的问题是:是否有技巧可以将我的 gob 数据片段有效地解码为数据结构的集合?或者我应该以另一种方式存储我的数据结构(我假设用 RPUSH 存储我的数据可以防止非原子操作)
最佳答案
LRANGE命令返回一个列表。使用 redis.ByteSlices将该列表作为 [][] 字节。解码列表中的每个 gob:
items, err := redis.ByteSlices(d.Conn.Do("LRANGE", "objects", "0", "-1"))
if err != nil {
// handle error
}
var values []*Object
for _, item := range items {
var v Object
if err := gob.NewDecoder(bytes.NewReader(item)).Decode(&v); err != nil {
// handle error
}
values = append(values, &v)
}
这假设为每个插入列表的值创建了一个新的 gob.Encoder。
如果应用程序不在 Redis 中独立访问列表项,则对整个列表进行 gob 编码并将其存储为批量字符串:
var values []*Object
var buf bytes.Buffer
if err := gob.NewEncoder(&buf).Encode(values); err != nil {
// handle error
}
if _, err := d.Conn.Do("SET", "objects", buf.Bytes()); err != nil {
// handler error
}
解码方法如下:
items, err := redis.Bytes(d.Conn.Do("GET", "objects"))
if err != nil {
// handle error
}
var values []*Objects
if err := gob.NewDecoder(items).Decode(&values); err != nil {
// handle error
}
这是问题中这一行代码的旁白:
redis.String(d.Conn.Do("RPUSH", "objects", network.String()))
使用 network.Bytes() 来避免字符串分配。使用 redis.Int 解码来自 RPUSH 的整数返回值。编写代码如下:
n, err := redis.Int(d.Conn.Do("RPUSH", "objects", network.Bytes()))
或者如果你不关心从列表返回的元素的数量,写成:
_, err := d.Conn.Do("RPUSH", "objects", network.Bytes())
关于go - redigo 和 gob 如何检索 gob 数据 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39052200/
我正在使用“RPUSH”命令将我的对象推送到我的 redis 库中。 // object is of type interface var network bytes.Buffer gob.NewEn
这个问题在这里已经有了答案: Unable to decode gob data (1 个回答) 关闭 4 年前。 这是我的 Playground ,我正在尝试序列化结构列表并从文件中读回。 htt
在我的 Go 程序中,我用 gob 编码 []byte 数据 buf := new(bytes.Buffer) enc := gob.NewEncoder(buf) //dat
我想开发一个 type data struct 来实现磁盘存储。我在将数据对象编码为字节时遇到了问题。对于编码,我想使用 encoding/gob 包。 package data import (
我正在尝试将结构保存到 gob,但文件缺少嵌套类型的值。我可以自己保存 Matrix 类型,但 Network 结构的 gob 数据不包括 Matrix 值。有没有办法将这个嵌套结构保存到 gob 中
我在我的代码中做这样的事情 test1 = make(map[string]interface{}) test2 = make(map[string]interface{}) test3 = make
我有一个正在编码的简单结构类型。但是,我在解码数据时犯了根本性的错误。每次我尝试对其进行解码时,都会出现 EOF panic 错误。 //将 map 编码为gob。将 gob 保存到磁盘。从磁盘读取
我最近重组了我的代码,现在 main 包下有两个包:chain 和 api。 在 chain 中,我定义了一些结构 SomeStruct1、SomeStruct2 和这些结构的接口(interface
我正在尝试实现一个基于接口(interface)的消息队列,其中将作业作为字节推送到 Redis 队列。但是我在尝试解码字节流时不断收到 EOF 错误。 https://play.golang.org
我正在尝试将 []byte 通过 chan 提供给 gob 解码器。它可以工作,但起初解码器会抛出一大堆 EOF 错误,然后停止。当它停止抛出错误时,程序的行为与我预期的完全一样,它解码 gob 并正
我有一个非常非常大的 map 阵列(不是 slice ),然后我试图对其进行编码。我真的需要避免复制数组,但我不知道该怎么做。 到目前为止,我有这个: func doSomething() { va
我正在尝试将 gob 编码的数据保存在磁盘上的一个文件中,作为一个简单的数据存储。但是,当我下次打开它时,gob 编码器会忽略文件中已有的任何数据,并在发送数据之前重新发送已发送格式的定义。看到 go
我遇到了 gob 协议(protocol)问题(或者可能是一般的网络问题,我的知识薄弱),我不明白为什么下面的代码不能正常工作。它只是一个维护开放 TCP 连接并通过它发送多个 gob 的简单示例。该
这似乎无法正常工作,我不确定自己做错了什么。我正在尝试将 map 转换为 gob,对二进制文件进行 gzip 压缩并将其保存到文件中,然后再读回。 type Object struct { mystr
我们能否期望两个 Go 对象 x, y 使得 x 等于 y(假设接口(interface)和映射没有技巧,只是结构和数组)gob_encode(x) 和 gob_encode(y) 的输出将始终是一样
我已经阅读了 ( gob) 的文档,但我遇到了一些问题: 现在我知道如何像这样编码结构和解码了: func main() { s1 := &S{ Field1: "Hello
当我尝试使用 gob 编码器将类型为 map[mapKey]string 的 map 保存到文件中时,它没有将字符串保存到文件中。 这里的mapKey是struct,map value是长json字符
我主要使用 Python,但也在玩 Go。我写了下面的代码来做一些在 python 中非常简单的事情,我希望它也可以在 Go 中完成。 package main import ( "bytes
我有一个包含未导出字段的结构,应该进行 gob 编码和解码。 说: type A struct { s int } func (a *A) Inc() { a.s++ } 显然,在这种
是否可以使用 Gob 编码将结构串联附加到同一文件中?它适用于写作,但是当我不止一次地使用解码器阅读时,我遇到了: extra data in buffer 所以我首先想知道这是否可行,或者我是否应该
我是一名优秀的程序员,十分优秀!