ホームページ > バックエンド開発 > Golang > メモリコピーを使わずにGoで文字列からバイトスライスにアクセスするにはどうすればよいですか?

メモリコピーを使わずにGoで文字列からバイトスライスにアクセスするにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-02 02:43:30
オリジナル
871 人が閲覧しました

How to access a byte slice from a string in Go without a memory copy?

メモリ コピーを使用せずに文字列からバイト スライスにアクセスする

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート