如何在 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
函数的类型,定义为接口指定的。
在 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
函数的类型,定义为接口指定的。