ホームページ > バックエンド開発 > Golang > ゴーのスライスの容量と長さはどれくらいですか?

ゴーのスライスの容量と長さはどれくらいですか?

James Robert Taylor
リリース: 2025-03-19 12:19:32
オリジナル
238 人が閲覧しました

ゴーのスライスの容量と長さはどれくらいですか?

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のスライスの容量を変更するにはどうすればよいですか?

GOのスライスの容量は、作成されると不変です。既存のスライスの容量を直接変更することはできません。ただし、いくつかの方法を使用して、異なる容量の新しいスライスを作成できます。

  1. make関数の使用:指定された長さと容量の新しいスライスを作成できます。

     <code class="go">newSlice := make([]int, len(oldSlice), newCapacity) copy(newSlice, oldSlice)</code>
    ログイン後にコピー
    ログイン後にコピー
  2. append関数の使用:要素をスライスに追加すると、必要に応じて容量が自動的に増加します。

     <code class="go">s := []int{1, 2, 3} s = append(s, 4, 5, 6) // This might increase the capacity if needed</code>
    ログイン後にコピー
  3. 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のスライスの長さを超えてインデックスにアクセスしようとするとどうなりますか?

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のスライスの長さと容量の違いは何ですか?

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

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