「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > GZIP ライターの終了を延期すると Go でデータ損失が発生するのはなぜですか?

GZIP ライターの終了を延期すると Go でデータ損失が発生するのはなぜですか?

2024 年 11 月 18 日に公開
ブラウズ:590

Why Does Deferring GZIP Writer Closure Lead to Data Loss in Go?

GZIP ライターの終了を遅延するとデータ損失が発生する

Go では、遅延を使用して gzip.Writer を閉じると、予期しない EOF エラーが発生する可能性があります。 zip データからの読み取り。この問題を解決するには、問題の詳細を詳しく調べて、別の解決策を提供しましょう。

問題の理解:

gzip.Writer の Close メソッドは 2 つのタスクを実行します。 : 書き込まれていないデータを基礎となるライターにフラッシュし、GZIP フッターを書き込みます。ただし、提供されたコードでは:

func zipData(originData []byte) ([]byte, error) {
    // ...

    defer gw.Close()

    // ...
}

defer ステートメントは、周囲の関数 zipData が返されるまで gw.Close() の実行を遅らせます。したがって、zipData が終了して戻ると、フッターは保存されていないバッファに書き込まれ、返されたバイト配列には含まれません。これにより、圧縮されたデータから読み取ろうとしたときに予期しない EOF エラーが発生します。

代替解決策:

この問題を解決するには、ファイルを返す前にライターを閉じることをお勧めします。 zip データ:

func zipData(originData []byte) ([]byte, error) {
    // ...

    if _, err := gw.Write(originData); err != nil {
        return nil, err
    }

    if err := gw.Flush(); err != nil {
        return nil, err
    }
    gw.Close()

    // ...
}

戻る前にライターを明示的に閉じることで、GZIP フッターが保存されたバッファに書き込まれ、返されるバイト配列に確実に含まれるようになります。これにより、予期しない EOF エラーが防止され、圧縮されたデータの整合性が保証されます。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3