web-dev-qa-db-ja.com

GoのWriterから文字列を取得する最良の方法

組み込みのテンプレートシステムを使用してWebページを返すコードがあります。結果のマークアップが書き​​込まれるResponseWriterを受け入れます。マークアップ文字列としてを取得し、場合によってはデータベースに入れたいと思います。私はWriterの代わりに通常のResponseWriterを受け入れるメソッドを除外し、書かれたコンテンツを取得しようとしています。 Aha-Pipeが必要な場合があり、ReadStringライブラリからbufioで文字列を取得できます。しかし、パイプから出てくるPipeReaderReaderと互換性がないことがわかりました(ReadStringメソッドに必要です)。 W00t。ビッグサプライズ。したがって、PipeReaderを使用してbyte []を読み取ることができましたが、ReadStringが存在する場合は少し間違っているように感じます。

それでは、それを行う最善の方法は何でしょうか? Pipeに固執してバイトを読む必要がありますか、それともマニュアルにないものがありますか?

47
froderik

関数がio.Writerを受け入れる場合、*bytes.Bufferを渡して出力をキャプチャできます。

// import "bytes"
buf := new(bytes.Buffer)
f(buf)
buf.String() // returns a string of what was written to it

Http.ResponseWriterが必要な場合は、*httptest.ResponseRecorderを使用できます。応答レコーダーには、ResponseWriterに送信できるすべての情報が保持されますが、本文は*bytes.Bufferにすぎません。

// import "net/http/httptest"
r := httptest.NewRecorder()
f(r)
r.Body.String() // r.Body is a *bytes.Buffer
113