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

再スライスは Go スライスの基礎となる配列でどのように動作しますか?

Susan Sarandon
リリース: 2024-12-26 19:02:10
オリジナル
505 人が閲覧しました

How Does Re-slicing Behave with Underlying Arrays in Go Slices?

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

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