スライスの容量変更について: 最初の項目と最後の項目の削除
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 つのフィールドを持つ構造体です:
スライスの最後の 2 つの項目が削除されると (s = s[:len(s)-2])、len フィールドはデクリメントされますが、配列ポインターとキャップフィールドは同じままです。これは、基になる配列が変更されておらず、スライスが依然として同じ配列を参照しているためです。
ただし、スライスの最初の 2 つの項目が削除されると (s = s[2:])、新しい新しいスライスを保持するために配列が作成されます。 len フィールドがデクリメントされ、配列ポインターが新しい配列を指すように更新され、新しい配列の小さいサイズを反映するために cap フィールドもデクリメントされます。
結論
最初の項目が削除されると、スライスを収容するために新しい基礎となる配列を作成する必要があるため、スライスの容量が変化します。最後の項目が削除された場合は、既存の配列が引き続き使用できるため、これは必要ありません。
以上がGo でスライスの最初の要素を削除すると容量が変わるのに、最後の要素を削除すると容量が変わらないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。