4

我有未知类型的gobs。有没有办法打印出来查看里面?

可能有gob.Debug,但对我不可用 https://golang.org/src/encoding/gob/debug.go

谷歌搜索建议使用DecodeValue,但它需要初始化reflect.Value 如果我得到未知的 gob blob,那么我无法传递未知类型的初始化值

https://play.golang.org/p/OWxX1kPJ6Qa

package main

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


func encode1() []byte {

    x := "123"

    buf := &bytes.Buffer{}
    enc := gob.NewEncoder(buf)
    err := enc.Encode(x)
    if err != nil {
        panic(err)
    }
    return buf.Bytes()

}

func decode1(b1 []byte) {
    var x string
    dec := gob.NewDecoder(bytes.NewBuffer(b1))
    err := dec.Decode(&x)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%#v\n", x)
}

func decode2(b1 []byte) {
//  var x reflect.Value
    x := reflect.New(reflect.TypeOf(""))
    dec := gob.NewDecoder(bytes.NewBuffer(b1))
    err := dec.DecodeValue(x)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%#v\n", x)
    fmt.Printf("%#v\n", reflect.Indirect(x))
}

func main() {
    b1 := encode1()
    decode1(b1)
    decode2(b1)
}
4

1 回答 1

0

您需要在编码解码之前注册您的类型

寄存器在其内部类型名称下记录由该类型的值标识的类型。该名称将标识作为接口变量发送或接收的值的具体类型。只有将作为接口值的实现传输的类型才需要注册。期望仅在初始化期间使用,如果类型和名称之间的映射不是双射,它会出现恐慌。

于 2018-11-25T17:27:17.483 回答