如何在 Golang 中使用 Thrift 的 TMemoryBuffer?

How do you use Thrift's TMemoryBuffer in Golang?

在 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 的文档。

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

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

阅读 tour of go 以复习指针接收器。

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

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

思考这个问题的一种方法是 thrift.TMemoryBuffer 没有定义 Close 函数,但是 *thrift.TMemoryBuffer 定义了。并且函数 NewTBinaryProtocolTransport 需要一个具有 Close 函数的类型,定义为接口指定的。