ホームページ >バックエンド開発 >Golang >「unsafe.Pointer」から Go スライスまたは配列を安全に作成するにはどうすればよいですか?

「unsafe.Pointer」から Go スライスまたは配列を安全に作成するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-10 12:08:09973ブラウズ

How to Safely Create a Go Slice or Array from an `unsafe.Pointer`?

Go で安全でない配列または配列からスライスを作成する方法?

質問:

指定配列への安全でないポインタです。メモリを消費せずに配列または配列からスライスを作成するにはどうすればよいですか? copy?

答え:

Reflect を使用したスライスの作成:

推奨されるアプローチは、reflect パッケージを使用して安全でないデータと同じ基礎となるデータを指すスライス ヘッダーを作成します。 pointer.

// Create a slice header
sh := &reflect.SliceHeader{
    Data: p, // Unsafe pointer to the array
    Len:  size,
    Cap:  size,
}

// Use the slice header to create a slice
data := *(*[]byte)(unsafe.Pointer(sh))

Reflect を使用した配列の作成:

安全でないポインタから配列 (連続したメモリ内の要素へのポインタ) を作成するには、まず次のようにします。スライスしてからそれを取りますaddress:

// Create a slice
data := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
    Data: p,
    Len:  size,
    Cap:  size,
}))

// Get the address of the slice (pointer to the first element)
arr := (*[size]byte)(unsafe.Pointer(&data[0]))

注意事項と警告:

  • 予期しないメモリ アクセスを防ぐために、元の配列の有効期間が管理されていることを確認してください。
  • ガベージ コレクションが発生する可能性があるため、オブジェクトへの参照として uintptr 変数を使用しないでください。予期せず。
  • 必要に応じて runtime.KeepAlive() を使用して、元の配列が安全でないポインタから作成されたスライスまたは配列によって参照される前にガベージ コレクションされるのを防ぎます。

以上が「unsafe.Pointer」から Go スライスまたは配列を安全に作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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