我想知道是否有可能在源代码中直接使用gob编码的数据(例如在函数中)。原因是不必访问磁盘即可获取gob文件,从而提高性能。我知道memcached,redis和 friend 。我不需要TTL或其他任何精美功能。只是映射在内存中。数据将在“设置” /构建过程中被编码并转储到源代码中,以便在运行时只需要对其进行“解码”即可。

go应用程序基本上将充当小型只读嵌入式数据库。我可以使用json(基本上使用原始的json声明一个var)来做到这一点,但是我猜会降低性能,所以我想知道gob是否可能。

我尝试了不同的方法,但是我无法使其正常工作,因为基本上我不知道如何定义gob var(byte,[bytes] ??),并且解码器似乎期望使用io.Reader,因此在使用之前整天,我决定至少要问你这样的家伙。

可悲的尝试:

var test string
test = "hello"

p := new(bytes.Buffer)
e := gob.NewEncoder(p)
e.Encode(test)
ers := ioutil.WriteFile("test.gob", p.Bytes(), 0600)
if ers != nil {
    panic(ers)
}

现在,我想使用test.gob并将其添加到函数中。如我所见,test.gob的源代码类似于^H^L^@^Ehello
var test string

var b bytes.Buffer

b = byte("^H^L^@^Ehello")

de := gob.NewDecoder(b.Bytes())

er := de.Decode(&test)
if er != nil {
    fmt.Printf("cannot decode")
    panic(er)
}

fmt.Fprintf(w, test)

最佳答案

将数据存储在 byte slice 中。这是原始数据,这就是您从文件中读取数据的方式。

您的gob文件中的字符串不是“^ H ^ L ^ @ ^ Ehello”!这就是您的编辑器显示不可打印字符的方式。

b = byte("^H^L^@^Ehello")
// This isn't the string equivalent of hello,
// and you want a []byte, not byte.
// It should look like

b = []byte("\b\f\x00\x05hello")
// However, you already declared b as bytes.Buffer,
// so this assignment isn't valid anyway.


de := gob.NewDecoder(b.Bytes())
// b.Bytes() returns a []byte, you want to read the buffer itself.

这是一个工作示例http://play.golang.org/p/6pvt2ctwUq
func main() {
    buff := &bytes.Buffer{}
    enc := gob.NewEncoder(buff)
    enc.Encode("hello")

    fmt.Printf("Encoded: %q\n", buff.Bytes())

    // now if you wanted it directly in your source
    encoded := []byte("\b\f\x00\x05hello")
    // or []byte{0x8, 0xc, 0x0, 0x5, 0x68, 0x65, 0x6c, 0x6c, 0x6f}

    de := gob.NewDecoder(bytes.NewReader(encoded))

    var test string
    er := de.Decode(&test)
    if er != nil {
        fmt.Println("cannot decode", er)
        return
    }

    fmt.Println("Decoded:", test)
}

07-24 21:51