【发布时间】:2017-03-08 17:10:00
【问题描述】:
我有以下 proto 文件:
package dogs;
enum Breed {
terrier = 0;
shepherd = 1;
hound = 2;
};
message Dog {
required int64 nbLegs = 1;
optional int64 nbTeeth = 2 [default=24];
optional Breed breed = 3;
optional string name = 4;
}
以下 Go 程序使用 goprotobuf 包编写。程序
- 从标准输入读取 Varint 以获取编码消息的长度,
- 从标准输入读取该字节数到缓冲区中,然后
- 尝试将缓冲区解组为 Dog。
--开始代码--
package main
import "bufio"
import "encoding/binary"
import "os"
import "log"
import "fmt"
import "dogs"
import "code.google.com/p/goprotobuf/proto"
func render(dog *dogs.Dog) string {
return fmt.Sprintf("Dog: %v %v %v %v", dog.GetName(), dog.GetBreed(), dog.GetNbLegs(), dog.GetNbTeeth())
}
func main() {
var dog = new(dogs.Dog)
stdin := bufio.NewReader(os.Stdin)
sz, _ := binary.ReadVarint(stdin)
bytes := make([]byte, sz)
os.Stdin.Read(bytes)
buf := proto.NewBuffer(bytes)
err := buf.Unmarshal(dog)
if err != nil {
log.Fatal(err)
}
fmt.Fprintf(os.Stderr, "Receiving %s of length %d\n", render(dog), sz)
}
--结束代码--
还有这个编码的消息(前面有一个 Varint)(以 hexdump 形式)
0000000: 1408 0418 0222 0446 6964 6f .....".Fido
我可以使用 c++ 和 libprotobuf 作为 Dog with 成功解码
- 姓名:菲多
- 品种:猎犬
- nbLegs:4
- nb 牙齿:24
然而,在 go 程序中解组,总是返回错误“illegal tag 0”。
我怀疑我误解了解码 API,但到目前为止,我还看不出是怎么回事。
【问题讨论】:
标签: go protocol-buffers