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