ホームページ  >  記事  >  バックエンド開発  >  メモリコピーせずにGoの文字列からバイトスライスを取得するにはどうすればよいですか?

メモリコピーせずにGoの文字列からバイトスライスを取得するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-02 10:59:02757ブラウズ

How Can I Retrieve a Byte Slice from a String in Go Without Memory Copying?

Unsafe を使用したメモリコピーなしで文字列からバイトスライスを取得する

問題:

文字列を変換する必要があります特に大規模なデータ セットを処理する場合、メモリ コピーのパフォーマンスを犠牲にすることなく、バイト スライスにコピーできます。

答え:

ステップ 1: メモリ コピーを理解する問題

Go の文字列は不変です。つまり、その場で変更することはできません。したがって、[]byte(string) 構文を使用して文字列をバイト スライスに変換すると、メモリ コピーが作成されます。

ステップ 2: 安全でないを使用する

メモリを防ぐにはコピーなど、安全でない操作が行われる可能性があります。 unsafe String 関数を使用すると、基になる文字列データへのポインタを取得できます。

<code class="go">import "unsafe"

func unsafeGetBytes(s string) []byte {
    return (*[0x7fff0000]byte)(unsafe.Pointer(
        (*reflect.StringHeader)(unsafe.Pointer(&s)).Data),
    )[:len(s):len(s)]
}</code>

説明:

  • unsafe.String 関数は、文字列のデータへのポインター。
  • ポインターは大きなバイト配列 ([0x7fff0000] バイト) にキャストされます。 Go では、サイズが指定されていない配列への安全でないキャストが許可されます。
  • 配列は、文字列と同じ長さのバイト スライスを作成するために使用されます。

追加の考慮事項:

  • このメソッドは、不変性が問題にならない内部操作にのみ使用してください。
  • 一般的な文字列処理、WriteString またはループの最適化 (問題の説明で述べたとおり) の場合
  • gzip を使用して大規模なデータ セットを圧縮すると、メモリ コピーの回避によるパフォーマンスの向上が影を落とす可能性があります。

以上がメモリコピーせずにGoの文字列からバイトスライスを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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