メモリ コピーを使用せずに文字列からバイト スライスにアクセスする
Go の文字列は不変です。つまり、その内容を変更しようとする試みは無効になります。新しいコピーの作成が含まれます。これは、大規模な文字列データ セットを含む操作のパフォーマンスのボトルネックになる可能性があります。
ただし、安全でないパッケージを利用することで、このコピー プロセスをバイパスする方法があります。これにより、文字列の基になるメモリに直接アクセスできるようになり、コピーを作成せずにその内容をバイト スライスとして取得できるようになります。
安全でない変換
安全でないパッケージこの変換を実現するために必要な関数を提供します。
<code class="go">import unsafe "unsafe" func unsafeGetBytes(s string) []byte { return (*[0x7fff0000]byte)(unsafe.Pointer( (*reflect.StringHeader)(unsafe.Pointer(&s)).Data, ))[:len(s):len(s)] }</code>
この関数は、リフレクションを使用して文字列の内部表現にアクセスし、そのデータ ポインターを抽出し、コピーを実行せずにバイト スライスに変換します。
注意事項
このプロセスは文字列の不変性の保証をバイパスするため、安全ではないことに注意することが重要です。返されたバイト スライスを変更すると、元の文字列が破損する可能性があります。したがって、この変換は、そのようなリスクが管理および理解されている内部での使用にのみ推奨されます。
例
次の例を考えてみましょう:
<code class="go">s := "Hello, world!" data := unsafeGetBytes(s) fmt.Println(data, string(data))</code>
出力:
[72 101 108 108 111 44 32 119 111 114 108 100 33] Hello, world!
代替方法
安全でない変換が最も速い方法ですが、コピーせずに文字列の内容にアクセスする、より安全でより安全な代替方法もあります。
1 つのオプションは、io.Writer に文字列を書き込むときに io.WriteString() 関数を使用することです。この関数は、文字列をコピーせずに操作を実行できる場合があります。
別の代替方法は、インデックス付けまたはループを使用して、バイト スライスに変換せずに文字列の個々のバイトにアクセスすることです。
<code class="go">s := "something" var byteValues [len(s)]byte for i, v := range s { byteValues[i] = byte(v) }</code>
結論
これらの手法を理解することで、コードの安全性と正確性を維持しながら、パフォーマンス重視の操作の文字列処理を最適化できます。
以上がメモリコピーを使わずにGoで文字列からバイトスライスにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。