ホームページ > バックエンド開発 > Golang > Go スライスはその基礎となる配列とどのように相互作用するのでしょうか?

Go スライスはその基礎となる配列とどのように相互作用するのでしょうか?

Linda Hamilton
リリース: 2024-12-07 17:02:12
オリジナル
625 人が閲覧しました

How Do Go Slices Interact with Their Underlying Arrays?

Go における配列の基礎となるスライスの謎を明らかにする

Go プログラミングの領域では、スライスは、オブジェクトのコレクションを処理する柔軟な方法として機能します。事前に固定された長さを必要としないデータ。これらは、連続する要素のシーケンスにアクセスするための動的なメカニズムを提供します。ただし、スライスを操作する場合、多くの場合、スライスが参照する基になる配列を理解することが重要です。

次のシナリオを考えてみましょう。長さ 3 の整数配列があります。

nums := [3]int{1, 2, 3}
ログイン後にコピー

次の方法でスライスを作成します。最初の 2 つの要素をスライスします:

numSlice := nums[:2]
ログイン後にコピー

この場合、numSlice と nums の両方に上限を設けます。は 3 で、基礎となる配列の容量を示します。一方、len はそれぞれ 2 と 3 です。ここで、要素を numSlice に追加すると:

numSlice = append(numSlice, 10)
ログイン後にコピー

基になる配列 nums は [1 2 10] に変わり、numSlice がまだ元の配列を参照していることを示します。 numSlice と len の両方の容量は 3 のままです。

ただし、2 回目の追加操作では、

numSlice = append(numSlice, 20)
ログイン後にコピー

容量に達したため、numSlice の基になる配列を変更する必要があります。この新しい基になる配列は、容量が 2 倍になり、numSlice の len が 4 に更新されます。

新しい配列への参照を取得します

新しく作成された基になる配列にアクセスするには配列を使用すると、Go でリフレクト パッケージと安全でないパッケージの組み合わせを活用できます。 Reflect.SliceHeader 構造体は、Data という名前のフィールドを提供します。このフィールドには、スライスの基になる配列へのポインターが含まれています。

s := []int{1, 2, 3, 4}
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&s))
data := *(*[4]int)(unsafe.Pointer(hdr.Data))
ログイン後にコピー

この手法を利用すると、基になる配列に直接アクセスして操作できるため、より詳細な操作が可能になります。 Go プログラムのデータ管理を制御します。

以上がGo スライスはその基礎となる配列とどのように相互作用するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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