在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>
答案 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
函数的类型,该函数由接口指定。