-1

gob エンコードされたデータをソース コード (関数など) で直接使用できるかどうかを知りたいです。その理由は、gob ファイルを取得するためにディスクにアクセスする必要がなくなるため、パフォーマンスが向上するためです。memcached、redis、および友人を認識しています。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)
4

2 に答える 2

5

データをバイト スライスに格納します。これは生データであり、ファイルから読み取る方法です。

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)
}
于 2014-03-08T14:07:21.900 に答える
1

例えば、

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
    "io"
)

func writeGOB(data []byte) (io.Reader, error) {
    buf := new(bytes.Buffer)
    err := gob.NewEncoder(buf).Encode(data)
    return buf, err
}

func readGOB(r io.Reader) ([]byte, error) {
    var data []byte
    err := gob.NewDecoder(r).Decode(&data)
    return data, err
}

func main() {
    var in = []byte("hello")
    fmt.Println(string(in))
    r, err := writeGOB(in)
    if err != nil {
        fmt.Println(err)
        return
    }
    out, err := readGOB(r)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(out))
}

出力:

hello
hello
于 2014-03-08T14:34:44.847 に答える