Go言語のスライス・マップ・配列をまとめて比較してみよう!初心者でもわかる使い分けの基本
生徒
「先生、Go言語でスライス、マップ、配列ってありますけど、それぞれどう違うんですか?どれを使えばいいのか迷います…」
先生
「良い質問です。スライス、マップ、配列はデータをまとめて扱うときに使う構造ですが、特徴や使い方が違います。今回はそれぞれの違いをわかりやすく説明しますね。」
生徒
「ぜひお願いします!具体的にどう違うのか知りたいです。」
先生
「では、基本的なことから順番に説明していきましょう!」
1. 配列(Array)とは?
配列は「同じ種類のデータを決まった数だけ並べた箱」のようなものです。サイズ(要素数)が決まっていて変わらないことが特徴です。
例えば、5つの整数を保存したいときは、5個分の箱を用意し、その中に値を順番に入れます。
配列は使うときにサイズを決めて固定するので、大きさを途中で変えられません。
var arr [5]int // 整数型の要素が5つの配列
arr[0] = 10 // 1番目の要素に10を入れる
配列のサイズは固定なので、あとから要素を増やしたり減らしたりはできません。
2. スライス(Slice)とは?
スライスは「配列のサイズが決まっていない、もっと自由に使える箱」のようなものです。必要に応じてサイズが増えたり減ったりします。
配列の便利な点は残しつつ、サイズ変更が簡単にできるので、よく使われます。
var slice []int // 整数型のスライス(サイズは決まっていない)
slice = append(slice, 10) // 値を追加
append関数を使うと、新しい要素を簡単にスライスに追加できます。
スライスは内部的に配列を使っていますが、サイズ変更が自由なので、柔軟に扱えます。
3. マップ(Map)とは?
マップは「キー(名前)と値をセットにして保存する箱」のようなものです。英語で「連想配列」とも呼ばれます。
数字の順番ではなく、好きな名前(キー)で値を取り出せるので便利です。
var m map[string]int
m = make(map[string]int) // マップの作成
m["apple"] = 100 // "apple"というキーに100をセット
たとえば、「りんご」という名前で値を保存し、あとで「りんご」の値だけを取り出せます。
4. 配列・スライス・マップの違いを表で比べてみよう
| 特徴 | 配列 | スライス | マップ |
|---|---|---|---|
| サイズ | 固定(変更不可) | 可変(増減可能) | 可変(キーと値のセット) |
| データの順番 | 順番が決まっている | 順番が決まっている | 順番は保証されない |
| 要素のアクセス方法 | 番号(インデックス)でアクセス | 番号(インデックス)でアクセス | キー(名前)でアクセス |
| 使いどころ | サイズが固定で要素数が決まっている場合 | 要素数が変わる可能性がある場合 | 名前付きのデータを扱いたい場合 |
| 初期化 | 宣言時にサイズ指定 | 宣言後にmakeやリテラルで初期化 | make関数で初期化必須 |
5. どんなときに何を使う?
それぞれの特徴を踏まえて、よくある使い分け例を紹介します。
- 配列:小さくてサイズが変わらないデータ。例えば曜日の名前など。
- スライス:動的に増減するデータ。例えばユーザーが追加できるリスト。
- マップ:名前(キー)で値を管理。例えば商品の名前と価格の対応表。
6. まとめてコード例を見てみよう
package main
import "fmt"
func main() {
// 配列
var arr [3]string
arr[0] = "りんご"
arr[1] = "みかん"
arr[2] = "バナナ"
fmt.Println("配列:", arr)
// スライス
slice := []string{"りんご", "みかん"}
slice = append(slice, "バナナ")
fmt.Println("スライス:", slice)
// マップ
m := make(map[string]int)
m["りんご"] = 100
m["みかん"] = 80
fmt.Println("マップ:", m)
}
このコードでは、配列はサイズが決まっていて、スライスは要素を追加でき、マップは名前(キー)で値を管理しているのがわかります。
7. 使い分けのポイント
Go言語の配列・スライス・マップはどれも大切なデータ構造です。使い分けのポイントは、
- データのサイズが決まっているか
- 順番が重要か
- 名前でアクセスしたいか
を考えて選びましょう。
まとめ
Go言語の配列やスライスやマップは、どれもデータをまとめて扱うための大切な仕組みであり、初心者が最初につまずきやすい部分でもあります。とくに配列は要素数が固定される特徴があり、スライスはサイズが自由に増減できる柔軟さを持ち、マップは名前による管理ができる便利な構造です。これらを正しく理解することで、データ操作の幅が大きく広がり、実践的なプログラムの設計がぐっと楽になります。配列は決まった数のデータを扱うときに向いており、スライスはユーザーが自由に追加できるリストなどのように変化のある場面で役立ちます。さらにマップは商品の名前や会員情報やカテゴリ名など「キーと値の組み合わせ」を扱うときに使われ、非常に多くの処理で利用されます。
初心者が混乱しやすいのは、配列とスライスが似ている点ですが、内部の仕組みが異なるため、使い分けを理解することが大切です。スライスは内部に配列を持っていますが、サイズが自動的に変わり、appendを使うことで簡単に値を追加できます。これにより、スライスはGo言語で最も頻繁に使われるデータ構造となっています。一方、配列はサイズが変わらないという制約があるため、実務ではあまり多用されませんが、メモリ管理や固定データの扱いにおいて重要な役割を持ちます。マップは名前でアクセスできるため非常に便利ですが、順番が保証されないという特徴があり、並び順が必要なプログラムでは注意が必要です。
また、配列やスライスやマップを使った処理では、for文やレンジ構文や条件分岐など基本的な構文と組み合わせることで、より複雑な処理が可能になります。特にスライスとマップは、実際のアプリケーション開発において入力データや結果の保持や情報の管理に欠かせない存在です。配列は学習用として理解しておくことでスライスの仕組みを深く知ることができ、それが後々大きな理解につながります。さらにマップはWebアプリケーションでの設定情報、商品リスト、ユーザー情報など、ありとあらゆる場面で使われるため、初心者のうちに慣れておくと必ず役に立ちます。
ここではまとめとして、配列とスライスとマップの特徴を簡潔に整理し、より実践的なコード例も少し紹介します。大切なのは「どの場面でどの構造を選ぶべきか」を自分で判断できるようになることです。データの数が固定なら配列、増える可能性があるならスライス、名前で管理したいならマップという三つの軸を意識すると、適切な選択が自然にできるようになります。実際のプログラムを書くときには、これらの特徴をふまえて組み合わせることで、より読みやすく、より使いやすいコードになります。
まとめとしてのサンプルプログラム
package main
import "fmt"
func main() {
fruits := [3]string{"りんご", "みかん", "バナナ"}
fmt.Println("配列:", fruits)
list := []string{"りんご", "みかん"}
list = append(list, "バナナ")
fmt.Println("スライス:", list)
table := make(map[string]int)
table["りんご"] = 120
table["みかん"] = 90
fmt.Println("マップ:", table)
}
このサンプルでは配列で固定データを扱い、スライスで可変データを追加し、マップで名前と値を管理するという典型的な使い分けを示しています。これらの構造を繰り返し使うことで、自然と自分の中にデータ構造の理解が定着していきます。どのデータ構造を使うか迷ったときは、用途や性質に応じて判断し、まずは簡単なコードで手を動かすことが理解への近道になります。実際の開発でも頻繁に登場するスライスやマップを早い段階で使いこなせるようになると、プログラムの表現力が大幅に高まり、より複雑なデータ処理にも挑戦できるようになります。
生徒
「今日学んだ配列やスライスやマップの違いがだいぶわかってきました。特にスライスが一番使いやすくて便利だと感じました。」
先生
「そうですね。スライスは可変で扱いやすいのでGo言語の実務でもよく使われます。配列は決まった数のデータに向いていて、マップは名前で値を管理したいときにとても役立ちます。」
生徒
「マップは順番が決まらないという特徴も勉強になりました。キーで管理する仕組みはアプリ開発でもよく使われそうですね。」
先生
「そのとおりです。配列とスライスとマップを正しく使い分けられるようになると、データ構造の理解が深まり、より読みやすく効率的なコードが書けるようになりますよ。」
生徒
「次はこれらを組み合わせてもっと複雑な処理にも挑戦してみたいです!」
先生
「ぜひ挑戦してみてください。今日学んだ基礎は必ず役に立つので、自信を持って書いていきましょう。」