Go言語の配列の基本!定義・初期化・アクセス方法をやさしく解説
生徒
「Goでよく聞く“配列”って何ですか?どうやって使うんでしょう?」
先生
「配列は同じ種類のデータを順番に並べた“箱”のようなものです。数字や文字をグループで扱えるんですよ。」
生徒
「グループ?どうやって作るんですか?」
先生
「順を追って、定義・初期化・アクセスまで、やさしく見ていきましょう!」
1. Go言語における配列とは?
Goの配列(array)は、同じ型のデータを一定個数だけ並べて扱うための入れ物です。あらかじめ「いくつ入るか(長さ)」が決まっており、途中で増えたり減ったりはしません。
イメージとしては「リンゴが5個だけ入る仕切り付きの箱」。箱の数=配列の長さが決まっているので、入れる果物の種類(型)も大きさ(長さ)も最初に確定します。決まった数をきちんと並べたいときに向いています。
まずは「整数が3つ入る配列」を作って、中身をまとめて表示してみましょう。
package main
import "fmt"
func main() {
// 整数を3つだけ入れられる配列(固定長)
nums := [3]int{10, 20, 30}
fmt.Println(nums) // [10 20 30] と表示される
}
ここでは[3]intという“型”で、「整数が3個入る配列」を表しています。数を4個や2個に変えたいなら、[4]intや[2]intといったように長さを含めて型を決めるのがポイントです。まずは「同じ型を、決まった数だけ並べる箱」だと覚えておけば十分です。
2. 配列の定義と初期化
配列は次のように書きます:
var nums [5]int
これは「整数(int)を5つ入れる配列」と定義し、初期化(0で埋められます)されています。0や""など、ゼロ値(zero value)で初期化されるのがGoの特徴です。
初期値付きで書くと:
nums := [5]int{1, 2, 3, 4, 5}
これで1〜5の数字を持つ配列が作れます。
3. 要素へのアクセス方法
配列から値を取り出すには、添字(index)を使います。添字は0から始まります。
fmt.Println(nums[0]) // 1
nums[2] = 99 // 3番目を99に変更
fmt.Println(nums[2]) // 99
このように添字で箱を指定して値を取り出したり、変更したりできます。なお、添字が範囲外だとエラーになります。
4. len関数でサイズを取得する
配列の長さはlen(nums)で調べられます。たとえば:
fmt.Println(len(nums)) // 5
この数字を使って、後でループ処理などがしやすくなります。
5. forループと配列
配列の中身を順番に処理するにはforループを使います。
for i := 0; i < len(nums); i++ {
fmt.Println(i, nums[i])
}
これは「iが0から長さ未満まで」の間、順番に値を取り出す方法です。
6. rangeを使ったイディオム
Goではもっとかんたんに配列をループする方法があります:
for idx, val := range nums {
fmt.Println(idx, val)
}
rangeは「配列(やスライス、マップ)を範囲指定する」という意味で、添字と値を自動で取り出せます。
7. 配列とスライスの違い
Goには配列と似ているスライス(slice)という仕組みもあります。スライスは長さが変えられる配列のようなもので、初心者にはスライスの方が使いやすいです。
配列は固定数、スライスは「伸び縮みする箱」と覚えるとイメージしやすいです。
8. 配列のコピーに注意!
配列を別の変数に代入すると、中身が全部コピーされます。大きな配列ではメモリが余計に使われるので注意が必要です。
たとえば:
a := [5]int{1,2,3,4,5}
b := a
b[0] = 100
fmt.Println(a[0]) // 1(元の値は変わらない)
これは意図しないデータのずれを防ぐための動作です。
9. どんなときに配列を使う?
配列は小さくて固定サイズのデータを使うときに向いています。たとえば「週7日分の気温」などです。
一方で、可変長データの場合はスライスを使うのが一般的です。
まとめ
Go言語における配列(array)は、同じ型のデータを決まった数だけ並べて扱うための非常に基本的かつ重要な仕組みです。この記事では、Go配列の定義・初期化方法、要素へのアクセス、長さの取得、ループ処理との連携、rangeを使った効率的なループ、配列とスライスの違い、コピーの注意点、さらには配列の利用シーンまでを、初心者にもわかりやすく解説しました。
特にGo言語における配列は「長さも型の一部」として扱われるため、CやJavaScriptなど他の言語に慣れている人にとっては少し注意が必要です。Goでは[3]intと[4]intはまったく異なる型として扱われるため、型の一致が重要になります。
一方で、スライス(slice)はより柔軟にデータを扱えるため、可変長データを扱う場合はスライスが推奨されます。しかし、配列は要素数が厳密に決まっている状況では、可読性・保守性・パフォーマンスの観点から非常に有効です。
また、for文やrangeを使ったループでは、それぞれ異なるメリットがあります。for i := 0の形式はインデックスの管理が明示的で、rangeはより簡潔に書けて読みやすいという特徴があります。使い分けることで、より意図が明確なコードを書くことができるでしょう。
配列を別の変数に代入した際には中身がコピーされるという点もGo特有の仕様です。これはバグを防ぐ上では役に立ちますが、大きな配列を頻繁にコピーしてしまうとメモリ効率が悪くなるため、必要に応じてスライスやポインタの活用を検討しましょう。
最後に、配列を使うべき場面としては、要素数が不変であると明確に分かっているケースです。例としては「曜日の一覧(7要素)」「RGBカラー(3要素)」「月の名前(12要素)」などがあります。これらは配列として定義することで、コード上にもその意図が明確に表れ、将来的な保守においても安心です。
固定長の例としての再サンプル:月の名前を表示
package main
import "fmt"
func main() {
months := [12]string{"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
for _, m := range months {
fmt.Println(m)
}
}
上記のように、「12個あることが前提」のデータを配列で表現すると、設計意図が明確になり、エラーの混入も防ぎやすくなります。
生徒
「配列ってただデータを並べるだけじゃなくて、“数が決まってること”を明確にする役割もあるんですね!」
先生
「そのとおり。配列は“何個あるか”を最初から確定させることで、バグの防止や意図の明示につながるんだ。」
生徒
「rangeでループするときも書き方がすっきりしていて、スライスにも応用できそうですね。」
先生
「うん、rangeはGoらしい書き方だし、for文と使い分けできるようになればより強くなれるよ。」
生徒
「今日は“固定長データの管理”の基本がしっかりわかった気がします!」
先生
「よくできました!配列の考え方は、Goだけでなく他の言語にもつながるから、しっかり身につけておこう。」