ホームページ  >  記事  >  バックエンド開発  >  Go でスライスの最初の要素を削除すると容量が変わるのに、最後の要素を削除すると容量が変わらないのはなぜですか?

Go でスライスの最初の要素を削除すると容量が変わるのに、最後の要素を削除すると容量が変わらないのはなぜですか?

DDD
DDDオリジナル
2024-11-04 02:30:01333ブラウズ

Why Does Dropping the First Elements of a Slice in Go Change its Capacity, But Dropping the Last Doesn't?

スライスの容量変更について: 最初の項目と最後の項目の削除

Go では、スライスは、動的にサイズ変更可能なデータ構造です。基礎となる配列のビュー。スライスの容量が変化すると、基礎となる配列とメモリ管理に影響します。

次の Go コードを考えてみましょう。

<code class="go">package main

import "fmt"

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

    // Drop its last two values
    s = s[:len(s)-2]
    printSlice(s)

    // Drop its first two values.
    s = s[2:]
    printSlice(s)
}

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

スライスの容量はなぜ変化するのですか?最初の 2 つの項目はドロップされますが、最後の 2 つの項目がドロップされるときはドロップされません?

この質問に答えるには、Go スライスがどのように実装されているかを理解する必要があります。これらは 3 つのフィールドを持つ構造体です:

  • array: 基礎となる配列へのポインター
  • len: スライス内の要素の数
  • cap: 容量スライスの、または保持できる要素の最大数

スライスの最後の 2 つの項目が削除されると (s = s[:len(s)-2])、len フィールドはデクリメントされますが、配列ポインターとキャップフィールドは同じままです。これは、基になる配列が変更されておらず、スライスが依然として同じ配列を参照しているためです。

ただし、スライスの最初の 2 つの項目が削除されると (s = s[2:])、新しい新しいスライスを保持するために配列が作成されます。 len フィールドがデクリメントされ、配列ポインターが新しい配列を指すように更新され、新しい配列の小さいサイズを反映するために cap フィールドもデクリメントされます。

結論

最初の項目が削除されると、スライスを収容するために新しい基礎となる配列を作成する必要があるため、スライスの容量が変化します。最後の項目が削除された場合は、既存の配列が引き続き使用できるため、これは必要ありません。

以上がGo でスライスの最初の要素を削除すると容量が変わるのに、最後の要素を削除すると容量が変わらないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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