你如何在Golang中使用Thrift的TMemoryBuffer?

时间:2017-11-22 09:58:43

标签: go thrift

在Go中,我有一个字节数组data []byte,我试图将其读入由Thrift生成的对象中。在C#中,工作代码如下:

var request = new Request();

using (var transport = new TMemoryBuffer(data))
using (var protocol = new TBinaryProtocol(transport))
{
   request.Read(protocol);
}

但是在Go中,它不起作用:

request := app.NewRequest()

transport := thrift.TMemoryBuffer{
    Buffer: bytes.NewBuffer(data),
}
protocol := thrift.NewTBinaryProtocolTransport(transport) // error here
request.Read(protocol)

它给出的错误是:

cannot use memoryBuffer (type thrift.TMemoryBuffer) as type thrift.TTransport in argument to thrift.NewTBinaryProtocolTransport:
thrift.TMemoryBuffer does not implement thrift.TTransport (Close method has pointer receiver)

我不确定如何解决这个问题,因为TMemoryBuffer似乎没有实现TTransport而且我找不到应该如何使用TMemoryBuffer的文档。< / p>

1 个答案:

答案 0 :(得分:4)

该错误的重要部分是Close method has pointer receiver

可以在类型或指向该类型的指针(即指针接收器)上定义函数,TTransport接口使用指针接收器定义函数Close。

阅读tour of go以获取有关指针接收器的更新信息。

将代码更改为以下内容应该有效:

transport := &thrift.TMemoryBuffer{
    Buffer: bytes.NewBuffer(data),
}

考虑问题的一种方法是thrift.TMemoryBuffer没有定义Close函数,但*thrift.TMemoryBuffer会这样做。函数NewTBinaryProtocolTransport需要一个定义为Close函数的类型,该函数由接口指定。