ホームページ  >  記事  >  バックエンド開発  >  golangでio.Readerからターゲットbytes.Bufferにデータを直接コピーする正しい方法は何ですか?

golangでio.Readerからターゲットbytes.Bufferにデータを直接コピーする正しい方法は何ですか?

WBOY
WBOY転載
2024-02-05 21:36:08722ブラウズ

将数据从 io.Reader 直接复制到 golang 中的目标 bytes.Buffer 的正确方法是什么?

質問の内容

データを io.Reader から bytes.Buffer 構造に直接コピーしたいコードがあります。メモリ内のキャッシュ。ここで、io.Copy(dstBytesBuffer, Reader) を呼び出すだけです。しかし、io.Copy コードを見ると、バッファ自体を作成し、リーダーからのデータをそのバッファにコピーし、そのバッファから dstBytesBuffer に書き込んでいるように見えます。それをスキップしてリーダーから宛先バッファに直接コピーする方法はありますか?


正解


io.Copy()を使用してください。 io.Copy() 複数のユースケース向けに「最適化」されています。ドキュメントの引用:

src が EOF に達するか、エラーが発生するまで、src から dst にコピーします。コピーされたバイト数と、コピー中に発生した最初のエラー (存在する場合) を返します。

コピーが成功すると、err == EOF ではなく、err == nil が返されます。 Copy は src から EOF まで読み取るように定義されているため、Read の EOF は報告すべきエラーとして扱われません。

src が WriterTo インターフェイスを実装している場合、コピーは src.WriteTo(dst) を呼び出すことによって行われます。それ以外の場合、dst が ReaderFrom インターフェイスを実装している場合、コピーは dst.ReadFrom(src) を呼び出すことによって行われます。

sourceio.Reader については何もわかりません。たとえ効率的な phppcncphpcnWriteTo(dst) メソッドが提供されなかったとしても、私たちはあなたが何をしているのかを間違いなく知っています。ベースは bytes.Buffer で、Buffer があるため io.ReaderFrom を実装します。 .ReadFrom() メソッドは、追加のバッファを作成または使用せずに、指定された io.Reader から読み取ります。

以上がgolangでio.Readerからターゲットbytes.Bufferにデータを直接コピーする正しい方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。