Go でのスライスの再スライス: 混乱と明確さ
Go では、スライスはデータの配列を表す強力かつ効率的な方法です。ただし、初心者にとってその複雑さを理解するのは難しい場合があります。そのような側面の 1 つは、スライスの再スライスの概念です。
次のコードを考えてみましょう:
package main import "fmt" func main() { a := make([]int, 5) printSlice("a", a) b := make([]int, 0, 5) printSlice("b", b) c := b[:2] printSlice("c", c) d := c[2:5] printSlice("d", d) } func printSlice(s string, x []int) { fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x) }
プログラムは、a、b、c、d の 4 つのスライスを作成します。驚くべき結果は、b の最初の 2 つの要素のスライスとして作成されたスライス c の容量が 2 ではなく 5 であるということです。
この動作を理解するには、基礎となる配列の概念を詳しく調べる必要があります。 。 Go では、スライスには実際のデータは保存されません。むしろ、それらは基礎となる配列を参照します。スライスが作成されると、この基礎となる配列のセグメントを指します。
上記の例では、長さ 0、容量 5 で b が作成されると、基礎となる配列に 5 つのスロットが予約されます。 。スライス c が b から作成されると、それは b の最初の 2 つの要素に対するウィンドウになります。ただし、基になる配列、つまり c の容量は 5 のままで、これには b の未使用スロットも含まれます。
この再スライスの概念は、コードをわずかに変更することでさらに詳しく説明されます。
func main() { b := make([]int, 0, 5) c := b[:2] d := c[1:5] // this is equivalent to d := b[1:5] d[0] = 1 printSlice("c", c) printSlice("d", d) }
この場合、d の値を変更すると c の値も変更され、c と d が同じ基盤上の異なるウィンドウであることを示しています。 array.
Go でスライスを効果的に操作するには、再スライスの概念を理解することが重要です。これにより、メモリのコピーや再割り当てを必要とせずに、さまざまなデータ サイズに動的に調整するスライスを作成できます。
以上が再スライスは Go スライスの基礎となる配列でどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。