カテゴリ: Go言語 更新日: 2026/01/11

Go言語のスライスの容量(cap)と長さ(len)を理解しよう

Go言語のスライスの容量(cap)と長さ(len)を理解しよう
Go言語のスライスの容量(cap)と長さ(len)を理解しよう

先生と生徒の会話形式で理解しよう

生徒

「先生、Go言語のスライスって便利だけど、容量(cap)とか長さ(len)って何ですか?」

先生

「スライスの長さ(len)と容量(cap)は、スライスの大きさや使い方を理解するうえでとても大切なポイントです。簡単にいうと、長さは今使っている要素の数で、容量はスライスが内部で確保している領域の大きさのことですよ。」

生徒

「うーん、ちょっと難しいです。もう少しわかりやすく教えてください。」

先生

「では、日常生活の例え話を使って説明しますね!」

1. スライスの長さ(len)と容量(cap)って何?

1. スライスの長さ(len)と容量(cap)って何?
1. スライスの長さ(len)と容量(cap)って何?

スライスの長さ(len)は「いま実際に使っている要素の数」、容量(cap)は「そのスライスが内部で確保している最大の入れ物の大きさ」を表します。日常の例でいえば、入っているおかずの個数が長さ、弁当箱の大きさが容量です。弁当箱が大きければ、すぐに新しい箱を用意しなくてもおかずを追加できます。

もう少し踏み込むと、スライスは「配列への窓」のように動きます。長さは窓から見えている範囲容量は窓の先にどこまで余白があるかというイメージです。多くの場合はlen ≤ capになり、ゼロ値のスライスはlen=0かつcap=0です。Go言語のスライスの使い方や違いを理解するうえで、まずこの関係を押さえておくと後の操作(作成・追加・拡張)の理解がぐっと楽になります。


package main

import "fmt"

func main() {
    // 例1: リテラルで作ったスライス(長さと容量は同じになりやすい)
    fruits := []string{"りんご", "バナナ", "みかん"}
    fmt.Println("len(fruits):", len(fruits)) // 3
    fmt.Println("cap(fruits):", cap(fruits)) // 3

    // 例2: makeで長さと容量を別々に指定(余白をあらかじめ確保)
    nums := make([]int, 2, 5) // 長さ2・容量5
    fmt.Println("len(nums):", len(nums)) // 2
    fmt.Println("cap(nums):", cap(nums)) // 5
}

このように、いま入っている数=len用意してある入れ物の大きさ=capと覚えておくと迷いません。検索しやすい観点では「Go言語 スライス len cap とは」「Go スライス 容量 長さ 違い」「make で 長さ 容量 指定」といった言葉を目印にすると、関連する情報にも素早くたどり着けます。

2. Go言語でのスライスの長さ(len)と容量(cap)の確認方法

2. Go言語でのスライスの長さ(len)と容量(cap)の確認方法
2. Go言語でのスライスの長さ(len)と容量(cap)の確認方法

Go言語では、len()関数でスライスの長さを、cap()関数で容量を調べます。まずはリテラルで作ったスライスの基本的な確認から見ていきましょう。結果を見ながら「いま使っている数」と「用意されている入れ物の大きさ」の違いをつかむと、あとでappendするときの挙動も理解しやすくなります。


package main

import "fmt"

func main() {
    fruits := []string{"りんご", "バナナ", "みかん"}
    fmt.Println("長さ(len):", len(fruits)) // 実際に入っている要素の数
    fmt.Println("容量(cap):", cap(fruits)) // 確保している容量(多くは長さと同じ)
}

このコードを実行すると、


長さ(len): 3
容量(cap): 3

と表示され、リテラルで作成した直後は長さと容量が同じになりやすいことが分かります。次に、makeで「長さ」と「容量」を別々に指定して作る例です。余白を先に確保しておくと、すぐに容量拡張が起きにくくなり、要素追加がスムーズになります。


package main

import "fmt"

func main() {
    nums := make([]int, 2, 5) // 長さ2・容量5で用意
    fmt.Println("len(nums):", len(nums)) // 2(いま使っている数)
    fmt.Println("cap(nums):", cap(nums)) // 5(入れ物の大きさ)
}

このように、lencapをセットで確認すると状態が一目で分かります。検索の目印としては「Go言語 スライス 長さ 容量 確認方法」「Go スライス len cap 違い」「make append ゼロ値 nil スライス」あたりを覚えておくと、必要な情報にたどり着きやすくなります。

3. スライスの容量が大きい理由と使い方

3. スライスの容量が大きい理由と使い方
3. スライスの容量が大きい理由と使い方

スライスは動的にサイズが変わる便利な機能ですが、実は容量は長さより大きく作られることがあります。これは、あとでデータを増やしても効率よく追加できるようにするためです。

たとえば、下のように長さ3、容量5のスライスを作ることもできます。


fruits := make([]string, 3, 5)
fmt.Println("長さ(len):", len(fruits)) // 3
fmt.Println("容量(cap):", cap(fruits)) // 5

ここで、make関数は指定した長さと容量のスライスを作るときに使います。容量が5なので、あと2つデータを追加できる余裕があるという意味です。

Go言語を基礎からスッキリ学びたい人や、 文法だけでなく「実用的な使い方」まで押さえたい人には、 定番の入門書がこちらです。

基礎からわかるGo言語をAmazonで見る

※ Amazon広告リンク

4. スライスに要素を追加したときの容量の変化

4. スライスに要素を追加したときの容量の変化
4. スライスに要素を追加したときの容量の変化

スライスに要素を追加するときは、append()関数を使います。もし追加で容量が足りなくなると、Go言語は自動的にもっと大きな容量の新しいスライスを作ってくれます。


fruits := make([]string, 3, 5)
fruits[0] = "りんご"
fruits[1] = "バナナ"
fruits[2] = "みかん"

fmt.Println("追加前の容量:", cap(fruits)) // 5

fruits = append(fruits, "ぶどう")
fruits = append(fruits, "メロン")

fmt.Println("追加後の容量:", cap(fruits)) // 5のまま

fruits = append(fruits, "イチゴ")
fmt.Println("さらに追加後の容量:", cap(fruits)) // 容量が増えることがある

追加前は容量5ですが、6個目を追加したときに容量が自動で増えます。これはGoが内部で効率よくメモリ管理している証拠です。

5. ポイントを整理

5. ポイントを整理
5. ポイントを整理
  • スライスの長さ(len)は、今使っている要素の数。
  • 容量(cap)は、スライスが内部で確保している最大の要素数。
  • 容量は長さより大きいことがあり、データ追加の効率化に役立つ。
  • len()cap()はスライスの状態を調べる基本関数。
  • append()で要素を追加すると容量が自動で増えることがある。

まとめ

まとめ
まとめ

ここまで、Go言語のスライスにおける長さと容量の違い、さらに要素を追加したときの変化を丁寧に確認してきました。最初は聞き慣れない言葉に戸惑うかもしれませんが、実際の動きをサンプルプログラムで見ていくと、仕組みそのものはとても素直で、初心者でも直感的に理解できるように設計されています。長さは今入っているデータの数、容量はデータを追加できる余裕の大きさという考え方をしっかり押さえておけば、実務でも迷いにくくなります。特に容量が自動で広がる仕組みは「なぜ append で簡単に追加できるのか」という疑問に対する明確な答えであり、配列とは大きく違う便利な特徴です。プログラムの世界では、目に見えないメモリの管理が裏側で動いていますが、Go言語では難しい部分をあまり意識しなくても扱えるように作られているため、初心者でも大きなトラブルなく扱えます。

また、スライスの長さと容量が確認できるということは、今どれだけのデータが入っていて、これからどれだけ追加できるかを自分で把握できるということでもあります。プログラムが大きくなると、いつのまにか容量を使い切って別の領域にコピーされることも増えますが、それが分かっていれば「なぜ動作が遅くなったのか」「どこで負荷がかかったのか」といった原因を見つけやすくなります。特に、ゲームやデータ処理のように大量のデータを扱う処理では、スライスの容量をあらかじめ多めに用意しておくことで、無駄な再確保を減らして効率の良い動作につながります。こうした視点は、これからプログラムを書くうえで役に立つ場面がとても多く、知っているかどうかでコードの質が大きく変わることもあります。

さらに、スライスは見た目は配列に似ていますが、振る舞いは全く違います。配列は固定の大きさですが、スライスは状況に合わせて伸びることができます。まるで、使いながら成長するかばんのような存在です。最初はコンパクトでも、必要になれば大きくなるので、使う側としては特別な準備をしなくても自然に扱えます。もちろん内部ではしっかりと調整が行われていますが、その作業をわざわざ自分で書かなくていいというのが、スライスが広く使われている理由です。初心者ほど、こうした自動で助けてくれる機能は大きな味方になってくれます。

実際のサンプルプログラムをもう一つ用意しておきます。よりシンプルな例で、容量が変化する場面が分かりやすくなるようにしています。手元で動かすと、スライスの中で何が起きているのかがはっきり見えるので、自信を持ってコードが書けるはずです。


package main

import "fmt"

func main() {
    letters := make([]string, 0, 2)
    fmt.Println("最初:", len(letters), cap(letters))

    letters = append(letters, "あ")
    letters = append(letters, "い")
    fmt.Println("追加後:", len(letters), cap(letters))

    letters = append(letters, "う")
    fmt.Println("容量が増えた後:", len(letters), cap(letters))
}

このように、スライスは必要に応じて容量が増えるため、最初の容量はあまり気にせずに使い始めることができます。ただ、仕組みを知っていることで、コードの読みやすさや考え方が一段階深くなります。実際の現場では、大きなデータを扱う処理が増えてくると、こうした基本が理解できているかどうかが明暗を分けることも珍しくありません。いきなり難しい使い方を覚える必要はありませんが、少しずつ触れて理解しておくことで、自然と応用ができるようになります。

先生と生徒の振り返り会話

生徒

「最初は長さと容量って同じものだと思っていました。実際に数字で比べてみると違いがよく分かりますね。」

先生

「そうなんです。見た目では分かりませんが、スライスは内部で余裕を持って管理しています。だから append でどんどん追加できるんですよ。」

生徒

「なるほど。容量の余裕がなくなると新しい入れ物に移し替えるんですね。だから容量が急に大きくなることがあるんだ。」

先生

「その通りです。細かい動きを知っていると、思い通りにプログラムを書けるようになりますよ。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Go言語のスライスの長さと容量はどう違うのですか?

Go言語のスライスを勉強したばかりの初心者が混乱しやすいのが、長さと容量の違いです。長さは今入っているデータの数で、容量は内部で確保されている最大の入れ物の大きさです。この違いが分かると、appendでデータを増やしたときにどうして容量が変わるのかが理解できます。
関連記事:
カテゴリの一覧へ
新着記事
New1
Go言語
Go言語の短絡評価(ショートサーキット)を使った条件式の工夫をやさしく解説!初心者でも理解できる基本知識
New2
Go言語
Go言語の構造体の初期化パターンとコンストラクタ的関数の書き方を徹底解説!初心者でもわかる基本と実用例
New3
Kotlin
Kotlinの例外処理とキャンセルの連携を完全ガイド!初心者でもわかるCoroutineExceptionHandlerの使い方
New4
Go言語
Go言語のクロージャとは?関数内関数の活用例と仕組み
人気記事
No.1
Java&Spring記事人気No1
Kotlin
KotlinのChannelでデータをやり取りする方法を完全ガイド!初心者にもわかる非同期通信の基本
No.2
Java&Spring記事人気No2
Go言語
Go言語でのDB接続情報を環境変数で管理する方法|初心者でも安全に設定
No.3
Java&Spring記事人気No3
Kotlin
Kotlinのビルド設定エラーと解決法まとめ!初心者向けGradleトラブル対処ガイド
No.4
Java&Spring記事人気No4
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.5
Java&Spring記事人気No5
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.6
Java&Spring記事人気No6
Kotlin
Kotlinでテキスト表示・編集!初心者でもわかるTextViewとEditTextの使い方
No.7
Java&Spring記事人気No7
Kotlin
Kotlin DSLとGroovy DSLの違いをやさしく解説!初心者でもわかるGradleスクリプトの使い分け
No.8
Java&Spring記事人気No8
Go言語
Go言語のgo.modファイル完全ガイド!初心者でもわかる仕組みと書き方

💻 作業効率アップに

ノートPCを縦置きしてデスクを広く。
省スペースで片づく定番スタンド

UGREEN 縦型スタンドをAmazonで見る

※ Amazon広告リンク