ホームページ >バックエンド開発 >Golang >スライスは Go のスライス容量にどのような影響を与えますか?

スライスは Go のスライス容量にどのような影響を与えますか?

DDD
DDDオリジナル
2024-12-17 08:22:24508ブラウズ

How Does Slicing Affect Go Slice Capacity?

スライス容量の削減について

Go スライスは、ストレージに基礎となる配列を使用する効率的なデータ構造です。これらは長さと容量の組み合わせで表され、容量はスライスが保持できる要素の最大数を定義します。

スライス容量の変更

スライスの操作容量に影響を与える場合があります:

  • s = s[:0] およびs = s[:4] は、配列への基礎となるポインターを変更しないため、スライス容量を変更しません。
  • s = s[2:] は減少します。最初の 2 つを削除することでポインタを新しいスライスに変更するため、スライスの容量

次の Go プログラムについて考えてみましょう:

package main

import "fmt"

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    printSlice(s)

    s = s[:0]
    printSlice(s)

    s = s[:4]
    printSlice(s)

    s = s[2:]
    printSlice(s)
}

func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}

このプログラムの実行出力:

len=6 cap=6 [2 3 5 7 11 13]
len=0 cap=6 []
len=4 cap=6 [2 3 5 7]
len=2 cap=4 [5 7]

説明

最初、スライスの長さは 6、容量は 6 です。長さを 0 に変更してもポインターは変更されません。したがって容量は変わりません。長さを4つに伸ばしても容量は変わりません。ただし、2 番目の要素以降 (s = s[2:]) でスライスをスライスすると、ポインタが変更され、長さ 2、容量 4 の新しいスライスが作成されます。

データ復元

s = s[2:] は、スライスから最初の 2 つの要素を削除します。それらを回復する必要がある場合は、s = s[2:] 操作を実行する前に、それらを含む新しいスライスを作成する必要があります。

スライスのメモリ表現

スライスのメモリ表現を理解することは、s = の容量がなぜなのかを理解するために重要です。 s[2:] は減少します:

  • スライスが作成されると、それは基礎となる配列を指します。
  • スライスをスライスしても、新しい配列は割り当てられません。代わりに、元の配列への異なるポインタを持つ新しいスライス値が作成されます。
  • ポインタを変更すると、基礎となる配列の別の部分を指すようにスライスが事実上再割り当てされます。これは容量に影響を与える可能性があります。

以上がスライスは Go のスライス容量にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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