2017-11-22 9 views
0

Goでは、私はバイト配列data []byteを持っていますが、それはThriftによって生成されたオブジェクトに読み込もうとしています。次のようにC#では作業コードは次のとおりです。GolangでThriftのTMemoryBufferをどのように使用しますか?

var request = new Request(); 

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

しかしゴーで、それは動作しません:

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) 

私は方法がわかりませんよTMemoryBufferTTransportを実装していないようで、代わりにTMemoryBufferを使用する必要があるというドキュメントは見つかりません。

+2

タイプを明示的に作成するのではなく、['NewTMemoryBuffer'](https://godoc.org/github.com/nporsche/golang-thrift#NewTMemoryBuffer)を使ってみましたか? – abhink

+0

@abhinkそれは働いています、ありがとう!しかし、なぜ私は理解できません。 –

答えて

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関数を持つ型を必要とします。

+0

こんにちはアンパサンドの上に私の髪を引き裂いているとは信じられません!深い答えと説明をありがとう。今はすべて意味があります。 –

関連する問題