Goでは、スライスは、配列の上に構築された柔軟で強力なデータ構造です。長さと容量の2つの重要なプロパティがあります。
len()
関数を使用して、スライスの長さを取得できます。cap()
関数を使用して、スライスの容量を取得できます。以下はlen()
とcap()
の使用を示す簡単な例です。
<code class="go">package main import "fmt" func main() { s := make([]int, 5, 10) // Creates a slice with length 5 and capacity 10 fmt.Printf("Length: %d, Capacity: %d\n", len(s), cap(s)) }</code>
この例では、スライスs
長さは5、容量は10です。
GOのスライスの容量は、作成されると不変です。既存のスライスの容量を直接変更することはできません。ただし、いくつかの方法を使用して、異なる容量の新しいスライスを作成できます。
make
関数の使用:指定された長さと容量の新しいスライスを作成できます。
<code class="go">newSlice := make([]int, len(oldSlice), newCapacity) copy(newSlice, oldSlice)</code>
append
関数の使用:要素をスライスに追加すると、必要に応じて容量が自動的に増加します。
<code class="go">s := []int{1, 2, 3} s = append(s, 4, 5, 6) // This might increase the capacity if needed</code>
copy
関数の使用:古いスライスの内容を異なる容量で新しいスライスにコピーできます。
<code class="go">newSlice := make([]int, len(oldSlice), newCapacity) copy(newSlice, oldSlice)</code>
これらの方法を説明する例は次のとおりです。
<code class="go">package main import "fmt" func main() { s := []int{1, 2, 3} // Length: 3, Capacity: 3 fmt.Printf("Original: Length: %d, Capacity: %d\n", len(s), cap(s)) // Using make and copy newSlice := make([]int, len(s), 10) copy(newSlice, s) fmt.Printf("After make and copy: Length: %d, Capacity: %d\n", len(newSlice), cap(newSlice)) // Using append s = append(s, 4, 5, 6, 7) fmt.Printf("After append: Length: %d, Capacity: %d\n", len(s), cap(s)) }</code>
Goでは、スライスの長さを超えてインデックスにアクセスしようとすると、ランタイムパニックが発生します。これは、スライスの長さが安全にアクセスできるインデックスの範囲を定義するためです。
これが例です:
<code class="go">package main import "fmt" func main() { s := []int{1, 2, 3} // Length: 3 fmt.Println(s[0]) // This is valid fmt.Println(s[3]) // This will cause a runtime panic }</code>
あなたが見るエラーメッセージは次のようなものです:
<code>panic: runtime error: index out of range [3] with length 3</code>
このパニックは、インデックス3がスライスの境界の外側で、その長さが3であるために発生します。
GOのスライスの長さと容量は、さまざまな目的に役立ち、異なる役割を持っています。
len(s) - 1
にアクセスでき、これを超えてインデックスにアクセスしようとすると、ランタイムパニックが発生します。append
関数を使用して、スライスの長さを容量まで上げることができます。これらの違いの要約は次のとおりです。
長さ:
len(s)
経由でアクセスします。容量:
cap(s)
経由でアクセスします。これらの概念を示す例が次のとおりです。
<code class="go">package main import "fmt" func main() { s := make([]int, 3, 5) // Length: 3, Capacity: 5 fmt.Printf("Initial: Length: %d, Capacity: %d\n", len(s), cap(s)) s = append(s, 4) // Length: 4, Capacity: 5 fmt.Printf("After first append: Length: %d, Capacity: %d\n", len(s), cap(s)) s = append(s, 5) // Length: 5, Capacity: 5 fmt.Printf("After second append: Length: %d, Capacity: %d\n", len(s), cap(s)) s = append(s, 6) // Length: 6, Capacity might increase fmt.Printf("After third append: Length: %d, Capacity: %d\n", len(s), cap(s)) }</code>
この例では、スライスは3の長さと5の容量から始まります。要素を追加すると、容量に達するまで長さが増加します。元の容量を超えると容量が増加する場合があります。
以上がゴーのスライスの容量と長さはどれくらいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。