Go言語のスライスと配列の使い分け!それぞれのメリット・デメリット
生徒
「先生、Go言語にはスライスと配列という似たものがありますけど、どう違うんですか?どちらを使えばいいか迷います。」
先生
「いい質問です。スライスと配列は似ていますが、使い方や特徴が違います。簡単にいうと、配列はサイズが固定された箱で、スライスはその箱を柔軟に使える便利な道具です。」
生徒
「サイズが固定の箱と柔軟な道具って、具体的にどういうことですか?」
先生
「それでは、それぞれの特徴やメリット・デメリットを詳しく説明しますね!」
1. 配列とは?サイズが決まった固定の箱
配列は、あらかじめ「いくつのデータを入れるか」を決めてから使う仕組みで、サイズが固定されているのが最も大きな特徴です。イメージとしては、仕切りが決まっているお弁当箱のようなもので、一度作った仕切りの数をあとから増やしたり減らしたりすることはできません。
たとえば、5つの整数を入れる配列を作りたい場合は次のように書きます。
var numbers [5]int
この配列は「5つ入る箱」として扱われ、常に5つの要素を持ち続けます。途中で6個に増やしたり、3個に減らすことはできません。決まった数だけデータを管理したいときには非常にシンプルで扱いやすい構造です。
もう少しイメージしやすくするために、簡単に値を入れてみる例を見てみましょう。
numbers := [3]int{10, 20, 30}
fmt.Println(numbers) // [10 20 30] と表示される
このように、配列は「最初に決めたサイズを変えずに使い続ける」という点がポイントです。決まった数だけデータが必ず存在する前提の処理では、とても安心して使える仕組みといえるでしょう。
2. スライスとは?サイズが変えられる柔軟な道具
スライスは、配列をより使いやすくするために用意された仕組みで、「必要に応じて自由に大きさを変えられる入れ物」と考えるとイメージしやすくなります。配列が固定サイズのお弁当箱だとしたら、スライスは仕切りが伸び縮みして、あとから追加のおかずも入れられる弁当箱のような存在です。
スライスを作るときは次のように書きます。
fruits := []string{"りんご", "バナナ", "みかん"}
このスライスには3つの果物が入っていますが、途中で増やしたり減らしたりすることができます。スライスは「数が決まっていないデータ」を扱うのが得意で、初心者でも扱いやすいため、Go言語の実践的なコードで最もよく使われています。
たとえば、新しい果物を追加してみると次のように簡単です。
fruits = append(fruits, "ぶどう")
fmt.Println(fruits)
// => ["りんご" "バナナ" "みかん" "ぶどう"]
このように、スライスは「あとから必要になったデータを自由に追加できる」という柔軟さが何よりの特徴です。状況に応じてサイズを変えられるため、ほとんどのGoプログラムでスライスが選ばれています。
3. 配列のメリット・デメリット
ここでは、Go言語の配列を実際に使うときに知っておきたい「良いところ」と「気をつけたいところ」を整理してみます。配列はシンプルで分かりやすい反面、あとからサイズを変えられないという特徴がそのままメリットにもデメリットにもなります。
- メリット:サイズが固定なので、「必ずこの数だけ要素がある」と決め打ちでき、メモリの使われ方が明確になります。そのため、処理の予測がしやすく、高速に動作しやすいという利点があります。
- デメリット:サイズをあとから変更できないため、「もう1つだけ値を追加したい」と思っても、その配列自体を大きくすることはできません。要素数が変わる可能性があるデータには扱いづらく、新しい配列を作り直す必要が出てきます。
イメージとしては、固定の大きさの机の引き出しにものを入れるような感じです。引き出しの幅や仕切りの数は最初に決まっていて、あとから広げたり増やしたりはできません。その代わり、「この引き出しには必ず5個までしか入らない」と分かっているので、整理しやすく中身も把握しやすい、という安心感があります。
例えば、3人分の得点を配列で管理する場合は次のように書けます。
scores := [3]int{80, 90, 75}
fmt.Println(scores) // [80 90 75] と表示される
この配列は「3人分」と決めているため、4人目の得点は追加できません。こうした「人数が最初から決まっている」ような場面では配列が分かりやすく、それ以外の柔軟さが欲しい場面では、次の章で説明するスライスを使う、というイメージで考えると整理しやすくなります。
4. スライスのメリット・デメリット
スライスは、Go言語で日常的に使われるデータ構造で、柔軟にサイズを変更できるのが最大の魅力です。特に「データが増えるかもしれない」「場合によって減るかもしれない」といった状況では、スライスが大きな力を発揮します。一方で、その柔軟さゆえの注意点もありますので、ここでしっかり押さえておきましょう。
- メリット:要素数が変わる場面に強く、あとから自由に値を追加できるため、扱いやすさは抜群です。Go言語で最も使われている理由もここにあります。
- デメリット:内部では配列を参照しているため、要素が増え続けると、容量確保のために新しい配列を作ってコピーが行われることがあります。処理が重くなるケースもあるため、大量データを扱う際は動きに注意したいところです。
スライスは、必要に応じて広がったり縮んだりする「伸縮自在の引き出し」のようなイメージを持つと理解しやすくなります。たとえば、次のように後から新しい値を追加できます。
items := []string{"A", "B"}
items = append(items, "C")
fmt.Println(items) // => ["A", "B", "C"]
このとおり、append を使うだけで簡単に増やせてしまうのがスライスの便利なところです。ただし、裏側では新しい配列が自動的に用意されている場合もあるため、「仕組みは柔軟だが裏で少し頑張っている」という点も覚えておくと役立ちます。
5. 使い分けのポイント
配列とスライスは一見似ていますが、「どんな場面でどちらを選ぶか」を理解することで、Go言語のコードはぐっと書きやすくなります。特に初心者の方は、まず状況に応じた選び方を覚えるところから始めると混乱しにくくなります。
- データの数が最初から決まっているなら配列 — 例えば「1週間の気温を7日分だけ保存したい」など、必ず固定個数のデータしか扱わない場合に向いています。
- データの数が増減する可能性があるならスライス — 例えば「ユーザーが入力した件数だけデータを追加したい」など、あとから増える場面に柔軟に対応できます。
この違いを感覚的に理解するために、次のようなシンプルな例を比べてみると分かりやすくなります。
// 配列:人数が固定されている場面
friends := [3]string{"Aさん", "Bさん", "Cさん"}
// スライス:あとから増える可能性がある場面
members := []string{"Aさん", "Bさん"}
members = append(members, "Cさん") // 必要に応じて追加できる
この例では、配列は「3人と決まっている友達リスト」、スライスは「参加者が増えるかもしれないイベントの参加者リスト」として使い分けています。こうした考え方が身につくと、場面ごとに自然と正しい選択ができるようになります。
6. 配列とスライスのコード例
配列とスライスの違いをコードで見てみましょう。
// 配列(サイズ固定)
var arr [3]int = [3]int{10, 20, 30}
fmt.Println("配列:", arr)
// スライス(サイズ可変)
slice := []int{10, 20, 30}
fmt.Println("スライス:", slice)
slice = append(slice, 40) // 要素を追加
fmt.Println("追加後のスライス:", slice)
配列は要素数3で固定ですが、スライスはappendで要素を簡単に追加できます。
7. スライスの内部は配列
実はスライスは内部で配列を参照しているだけです。スライス自体は配列の「一部」を指すような仕組みです。
このため、スライスを使うときは配列のサイズ制限を気にせずにデータを扱えます。
8. 配列を使う場面は限定的
Go言語では配列を使う場面はあまり多くありません。たとえば、決まったサイズのデータを扱う特別な処理や、性能を極限まで追求したい場合です。
それ以外はスライスを使うことをおすすめします。
まとめ
Go言語の配列とスライスは見た目がよく似ているため、初心者にとって最初はどちらを使うべきか判断が難しく感じられます。しかし、プログラミングの現場では2つの違いを理解して使い分けることがとても大切です。配列は宣言時にサイズが固定されるため、決められた数だけデータを保持する用途に向いています。一方でスライスは柔軟にサイズを変えられ、appendで簡単に要素を追加できる利便性を持っています。そのため、データ量が変動する現実的なアプリケーション開発ではスライスが圧倒的に使いやすく、標準的な選択肢として扱われています。 また、スライスは内部で配列を参照するという仕組みから、配列の一部分に視点を当てて扱えることも大きな特徴です。複数の関数や処理の中で「部分的なデータ」を操作したいとき、スライスの存在はコードの見通しをよくし、複雑さを軽減します。配列と違い、必要に応じて伸びたり縮んだりするため、柔軟性を求めるプログラムにとても向いています。配列のメリットである固定長による高速性も特定の状況では役立ちますが、多くの場面ではスライスの方が自然で扱いやすいといえるでしょう。 ここでは配列とスライスを比較しながら、その特徴や利点を振り返り、さらに理解を深めるためのサンプルコードを掲載します。実際の挙動を確認することで、自分のプログラムではどちらを選ぶべきか判断しやすくなります。
サンプルコード:配列とスライスの総まとめ
package main
import "fmt"
func main() {
// 配列(固定長)
var arr [4]int = [4]int{1, 2, 3, 4}
fmt.Println("固定長配列:", arr)
// スライス(可変長)
slice := []int{1, 2, 3, 4}
fmt.Println("可変長スライス:", slice)
// スライスへ要素追加
slice = append(slice, 5)
fmt.Println("追加後のスライス:", slice)
// スライスは内部で配列を参照
sub := slice[1:4]
fmt.Println("スライスの一部切り出し:", sub)
// 配列の値を変更してもスライスとは無関係
arr[0] = 100
fmt.Println("変更後の配列:", arr)
// スライス内部の配列共有確認
slice[1] = 200
fmt.Println("変更後のスライス:", slice)
fmt.Println("切り出したスライスへの影響:", sub)
}
このサンプルからわかるように、配列とスライスでは「データの扱い方」と「内部構造」に明確な違いがあります。配列は常に固定長で、新しいサイズにしたい場合は新しい配列を作り直す必要があります。一方でスライスは柔軟に変化し、切り出しや追加も自然に行えます。さらに、スライスは内部で配列を共有するため、切り出し元のデータが変わると影響が出るという特徴があります。この挙動を理解しておくことで、予期せぬ値の変更を避けられ、プログラムの安定性が高まります。 また、性能的な側面では配列が有利な場面もありますが、Go言語の学習や一般的な開発においてはスライスを中心に使う方が自然です。スライスはデータ量の増減が頻繁に起こるような場合に特に強く、柔軟にサイズが変わることでコードの可読性と保守性も向上します。今回の内容を理解することで、配列とスライスの違いを踏まえた上で適切に使い分けられるようになり、より良いGo言語プログラムを作る基礎が身につくでしょう。
生徒
「配列とスライスって同じように見えていましたけど、特徴を知ると全然違うんですね!」
先生
「その通りです。特にスライスは柔軟に使えるので、実際のプログラミングではとても重宝しますよ。」
生徒
「appendを使えば簡単に増やせるところが便利ですね。配列にはない魅力です!」
先生
「ええ、スライスがよく使われる理由のひとつですね。内部で配列を参照している点も理解しておくと役立ちますよ。」
生徒
「切り出しの仕組みもおもしろかったです。配列ではできないことができるんですね。」
先生
「スライスの特徴を使いこなすと、データの取り扱いがとてもスムーズになります。ぜひ今後も使っていきましょう。」
【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導
「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。
本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。
具体的な開発内容と環境
【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。
【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。
この60分で得られる3つの理解
「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。
データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。
ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。
※本講座は、将来的にバックエンドエンジニアやクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。
初めてのGo言語を一緒に学びましょう!