0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語(Golang)におけるスライスの 関数lenと関数cap

Posted at

Go言語におけるスライスの lencap の違いについて説明します。

lencap の違い

  • len: スライスの現在の要素数を返します。これは、スライスに格納されている実際のデータの数を示します。
  • cap: スライスが持つことのできる最大の要素数を返します。これは、スライスが内部的に保持している配列の容量を示します。

スライスの動作

スライスは、配列のラッパーとして機能し、動的にサイズを変更できます。スライスの容量は、要素を追加する際に増加することがあります。具体的には、スライスの容量は以下のように変化します。

package main

import "fmt"

func main() {
  var x []int
  fmt.Println(x, len(x), cap(x)) // [] 0 0
  x = append(x, 10)
  fmt.Println(x, len(x), cap(x)) // [10] 1 1
  x = append(x, 20)
  fmt.Println(x, len(x), cap(x)) // [10 20] 2 2
  x = append(x, 30)
  fmt.Println(x, len(x), cap(x)) // [10 20 30] 3 4
  x = append(x, 40)
  fmt.Println(x, len(x), cap(x)) // [10 20 30 40] 4 4
  x = append(x, 50)
  fmt.Println(x, len(x), cap(x)) // [10 20 30 40 50] 5 8
}
  1. 初期状態: スライスが初期化されると、lencap は両方とも 0 です。

    x := []int{} // len(x) = 0, cap(x) = 0
    
  2. 最初の要素の追加: append を使って要素を追加すると、長さと容量が両方とも 1 になります。

    x = append(x, 10) // len(x) = 1, cap(x) = 1
    
  3. 2つ目の要素の追加: 再度 append を使うと、長さは 2 になりますが、容量も 2 となります。これは、スライスの内部配列が新しい要素を格納するために十分な容量を持っているためです。

    x = append(x, 20) // len(x) = 2, cap(x) = 2
    
  4. 3つ目の要素の追加: 3つ目の要素を追加すると、既存の容量を超えるため、新しい配列が作成され、容量が 4 になります。

    x = append(x, 30) // len(x) = 3, cap(x) = 4
    
  5. 4つ目の要素の追加: 容量が十分なため、長さは 4 で、容量は 4 のままです。

    x = append(x, 40) // len(x) = 4, cap(x) = 4
    
  6. 5つ目の要素の追加: またもや容量を超えるため、内部配列が再割り当てされ、容量が 8 に増加します。

    x = append(x, 50) // len(x) = 5, cap(x) = 8
    

まとめ

  • スライスの len は現在の要素数、cap はスライスが保持できる最大の要素数を示します。
  • append 操作を行う際に、現在の容量を超えると新しい配列が作成され、容量が増加します。この動的な管理により、Go言語のスライスは効率的にメモリを使用します。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?