ホームページ >バックエンド開発 >Golang >Golang で圧縮を行う方法といくつかの圧縮トリックを設定する方法

Golang で圧縮を行う方法といくつかの圧縮トリックを設定する方法

PHPz
PHPzオリジナル
2023-03-30 09:05:412554ブラウズ

Go 言語に付属の圧縮ライブラリ (compress) は、さまざまな圧縮および解凍関数を提供します。これらの関数を使用すると、情報をある形式から別の形式に変換して、保存や送信に適したものにすることができます。この記事では、Golang で圧縮する方法と、Golang 圧縮ライブラリをより有効に活用できるようにいくつかの圧縮テクニックをセットアップする方法について詳しく説明します。

  1. gzip 圧縮

Gzip は DEFLATE アルゴリズムに基づく圧縮形式で、入力データ内の繰り返し文字列を置き換えることによってデータを圧縮できます。 Gzip 圧縮ライブラリは Go 言語の標準ライブラリに実装されており、Gzip 圧縮アルゴリズムを実装しています。これを使用するには、圧縮パッケージをインポートし、関数 GzipWriter を使用してインスタンス化する必要があります。次に、Write() 関数を使用してデータを gzip バッファに書き込み、最後に Flush() 関数を使用してデータを書き込みます。バッファをメモリまたはディスクにフラッシュします。

次の例は、gzip 圧縮技術を説明するために使用できます:

package main

import (
    "compress/gzip"
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    w := gzip.NewWriter(&b)
    defer w.Close()

    data := []byte("Hello, World!")
    _, err := w.Write(data)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Compressed data: %q\n", b.String())
}

出力:

Compressed data: "\x1f\x8b\x08\x00\x00\x09\x6e\x88\xff\x4b\xcc\x4d\x55\x70\x76\x.00\x04\x00\x00\xff\xff\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21\x2.00\x00\x00\x00"

上の例では、出力ストリームを gzip.NewWriter と結合します。 () 関数 コンプレッサーは関連付けられており、defer ステートメントを使用してライターを遅延終了し、バッファー内のすべてのデータが確実に書き込まれるようにします。また、文字列を圧縮バッファに書き込み、最後に圧縮データを出力します。

  1. zlib 圧縮

zlib 圧縮は、入力データを同じデータ内容を持つ小さな出力データに変換するプロセスです。これは DEFLATE アルゴリズムに基づいており、最適な伝送効率を保証するため、Web コンテンツの圧縮やデータ伝送によく使用されます。 zlib は、データを zlib 形式に圧縮するための zlib.Writer タイプを提供します。次の例を使用すると、Go で zlib を圧縮する方法を理解できます:

package main

import (
    "bytes"
    "compress/zlib"
    "fmt"
)

func main() {
    var b bytes.Buffer

    w := zlib.NewWriter(&b)
    defer w.Close()

    data := []byte("Hello, World!")
    _, err := w.Write(data)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Compressed data: %q\n", b.Bytes())
}

出力:

Compressed data: "\x78\x9c\x4b\xcb\xcf\x4f\x2c\x4b\x2d\x01\x00\x12\x1c\x06\xc8"

上記の例では、bytes.Buffer バッファーを作成し、zlib.NewWriter 関数を使用します。 to コンプレッサーに関連付けられています。データはバッファに圧縮され、最後に圧縮されたデータが端末に出力されます。

  1. フラット圧縮

フラット圧縮パッケージは Golang 独自の圧縮パッケージの 1 つで、シングル バイト、1 ビットと 2 ビットの読み取り、3 ビットと 4 つのエンコーディングをサポートしています。ビット読み取りのメソッド。もちろん、この圧縮方法は複雑なデータ構造を処理できないため、単純なデータやテキストなどにのみ適しています。次の例を使用して、Golang flate 圧縮の使用方法を確認できます。

package main

import (
    "compress/flate"
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    w, err := flate.NewWriter(&b, flate.DefaultCompression)
    if err != nil {
        panic(err)
    }
    defer w.Close()

    data := []byte("Hello, World!")
    _, err = w.Write(data)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Compressed data: %q\n", b.String())
}

出力:

Compressed data: "\x01\x9d\x8c\x0f\x4c\x4f\x4e\xce\xcf\x49\xcd\x4b\xcd\xaf.00\x00\x00\xff\xff\x48\x65\x6c\x6c\x6f\x2,20\x57\x6f\x72\x6c\x64\x21\x2.00\x00"

上記の例では、文字列ライターを作成し、 flate.NewWriter( ) 関数アソシエートを使用しました。それをコンプレッサーで。データを圧縮するときは、圧縮レベルを指定する必要があります。 DefaultCompression は、当社が指定する最も一般的に使用される圧縮レベルであり、最適な圧縮を示します。コードを通じて圧縮データを出力します。

  1. snappy 圧縮

Snappy は、Google の高速データ圧縮および解凍アルゴリズムです。通常、高圧縮で保存する必要のないデータを処理するために使用されます。比率。 Go 言語の snappy パッケージはこの圧縮アルゴリズムを実装し、効果的な圧縮および解凍機能を提供します。 Go での snappy の使用方法を理解するには、次の例を使用します。

package main

import (
    "fmt"
    "github.com/golang/snappy"
)

func main() {
    data := []byte("Hello, World!")
    compressed := snappy.Encode(nil, data)

    fmt.Printf("Compressed data: %q\n", compressed)

    uncompressed, err := snappy.Decode(nil, compressed)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Uncompressed data: %q\n", uncompressed)
}

出力:

Compressed data: "\x0cHello, World!"
Uncompressed data: "Hello, World!"

上の例では、snappy.Encode() 関数を使用して「Hello, World」を変換します。 !" 文字列は圧縮され、snappy.Decode() 関数を使用して解凍されます。

概要

この記事では、compress 圧縮ライブラリを使用して Golang に 4 つの圧縮アルゴリズムを実装する例を示します。 gzip と zlib は最も一般的に使用される圧縮アルゴリズムであり、データ転送やネットワーク アプリケーションで広く使用されています。 Snappy は通常、データ圧縮に非常に高いパフォーマンス要件が必要なシナリオで使用されますが、 flate はあまり一般的ではありません。いずれの場合も、実際の状況に基づいて最適な圧縮アルゴリズムとその構成を選択し、アプリケーションのスケーラビリティとパフォーマンスを向上させることができます。

以上がGolang で圧縮を行う方法といくつかの圧縮トリックを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。