【Go言語】配列の使い方を分かりやすく解説!

2025年4月17日木曜日

Go言語

Go言語の配列って、なんだか難しそう…と感じていませんか?

複数のデータを扱うときに便利な配列ですが、Go言語特有の書き方があって、最初はちょっと戸惑うかもしれませんね。

でも大丈夫!この記事を読めば、Go言語の配列の宣言方法から基本的な使い方まで、しっかり理解できるようになりますよ。

この記事でわかること

  • Go言語の配列ってそもそも何?
  • 配列を宣言する色々な書き方
  • 宣言した配列の中身を見たり、変更したりする方法
  • 配列を扱う上でのちょっとした注意点


Go言語の配列とは?宣言前の基礎知識

まず、Go言語の「配列」がどんなものかを知っておきましょう。

配列は、同じ種類のデータ(例えば、数字だけ、文字だけ)を、いくつかまとめて入れておための箱のようなものです。

プログラミングでは、たくさんのデータを扱う場面がよくあります。例えば、テストの点数とか、曜日とかですね。そんな時に配列が役立ちます。

ここで一番覚えておいてほしいのは、Go言語の配列は「固定長」であるという点です。
つまり、最初に「箱を5個用意する!」と決めたら、後から6個に増やしたり、4個に減らしたりはできません

データを入れるための箱の数が、最初に決めた数でずっと変わらない、それがGo言語の配列の特徴なんです。

   配列のイメージ図 (例: 要素数5の整数型配列 int[5])

   インデックス番号:   0     1     2     3     4
                   +-----+-----+-----+-----+-----+
   各要素 (箱)  :  |     |     |     |     |     |
                   +-----+-----+-----+-----+-----+
                    ↑
                    ここに同じ種類のデータが入る
                    (宣言直後は初期値、例えばintなら0が入る)

イメージとしては、仕切りが固定された整理箱を想像してみてください。それぞれの仕切り(箱)には番号がついていて、同じ種類のモノ(データ)しか入れられません。

そして、仕切りの数を後から変えることはできない、という感じです。

【重要】Go言語「配列」の基本パターン

では、実際に配列を使えるように「宣言」してみましょう。

宣言というのは、「こういう配列を使いますよー!」とプログラムに教えてあげる作業です。
一番基本的な書き方は、以下のようになります。

// var 配列の名前 [箱の数]データの種類
var numbers [5]int

分解してみましょう。

  • var: 変数を宣言するときの合言葉です。
  • numbers: これが配列の名前です。好きな名前をつけられます(ルールはあります)。
  • [5]: 配列の「箱の数」(要素数や長さとも言います)を指定します。ここでは5個ですね。
  • int: 配列に入れる「データの種類」(型といいます)を指定します。intは整数を入れる型です。

これで、「numbers」という名前の、整数(int)を5個入れられる配列が用意されました。

この段階では、箱の中身は空っぽ…ではなく、Go言語が自動的に初期値を入れてくれます。整数の場合の初期値は「0」です。
実際に見てみましょう。

書き方

package main

import "fmt"

func main() {
    // 整数(int)を5個格納できる配列を宣言
    var numbers [5]int

    // 配列の中身を表示してみる
    fmt.Println(numbers)
}

ソースコードの表示結果

[0 0 0 0 0]

ちゃんと0が5個入っているのが分かりますね!

配列リテラルを使った宣言と初期化

配列を宣言するとき、同時に中身のデータ(値)も決めてしまいたい場合がありますよね。
そんな時に便利なのが「配列リテラル」を使った方法です。
書き方はこうです。

// 配列名 := [箱の数]データの種類{値1, 値2, ...}
fruits := [3]string{"Apple", "Banana", "Cherry"}

さっきのvarを使った書き方より、少し短く書けますね。
:= という記号を使うと、varとデータ型(ここでは[3]string)を省略できます。Go言語が賢く推測してくれるんです。
中括弧{}の中に、入れたい値をカンマ,で区切って書きます。

書き方

package main

import "fmt"

func main() {
    // 文字列(string)を3個格納でき、初期値を持つ配列を宣言
    fruits := [3]string{"Apple", "Banana", "Cherry"}

    // 配列の中身を表示
    fmt.Println(fruits)
}

ソースコードの表示結果

[Apple Banana Cherry]

このように、宣言と初期化を同時にできるのが配列リテラルの便利な点です。コードもスッキリします!

要素数を省略した配列の宣言 (`...`記法)

配列リテラルを使うとき、もっと楽できる書き方があります。
箱の数(要素数)を書く代わりに、...(ドット3つ)を使う方法です。

// 配列名 := [...]データの種類{値1, 値2, ...}
scores := [...]int{85, 92, 78, 90}

[ ]の中に...と書くと、中括弧{}の中に書いた値の数から、Go言語が自動的に配列の箱の数を数えて決めてくれます
上の例だと、値が4つあるので、scoresは要素数4の配列になります。

後から値を追加したり削除したりするときに、いちいち[ ]の中の数字を修正しなくて済むので、地味に便利ですよ。

書き方

package main

import "fmt"

func main() {
    // 要素数を...で省略して宣言(初期値から要素数を推測)
    scores := [...]int{85, 92, 78, 90}

    // 配列の中身を表示
    fmt.Println(scores)
    // 配列の長さを表示してみる
    fmt.Println(len(scores)) // len()については後で説明します
}

ソースコードの表示結果

[85 92 78 90]
4

ちゃんと4つの要素を持つ配列として作られているのが確認できました。要素数を数えなくても良いのは楽ちんですね!

Go言語で宣言した配列の使い方

さて、配列を宣言できるようになったら、次は実際に使ってみましょう。

宣言しただけでは宝の持ち腐れですからね。配列の中身を見たり、変えたり、順番に処理したりする方法を紹介します。

配列要素へのアクセス(インデックス指定)

配列の中に入っている個々のデータ(要素といいます)にアクセスするには、「インデックス」を使います。
インデックスとは、配列の箱に付けられた番号のことです。

ここで超・大事なポイント! Go言語(多くのプログラミング言語もそうですが)のインデックスは0から始まります。ここ、テストに出ますよ!(嘘ですけど、それくらい大事!)
つまり、3つの要素を持つ配列の場合、最初の要素のインデックスは0、2番目は1、3番目は2となります。

要素にアクセスする書き方は 配列名[インデックス番号] です。

書き方

package main

import "fmt"

func main() {
    fruits := [3]string{"Apple", "Banana", "Cherry"}

    // 2番目の要素 (インデックスは1) を表示
    fmt.Println(fruits[1]) // Banana が表示されるはず

    // 1番目の要素 (インデックスは0) の値を変更
    fruits[0] = "Orange"

    // 変更後の配列全体を表示
    fmt.Println(fruits) // [Orange Banana Cherry] になっているはず
}

ソースコードの表示結果

Banana
[Orange Banana Cherry]

このように、配列名[インデックス]で、値を見たり(読み取り)、新しい値を入れたり(書き込み)できます。

もし、存在しないインデックス(例えば、要素数3の配列でfruits[3])にアクセスしようとすると、プログラムがエラーで止まってしまう(パニックと言います)ので注意しましょう。

`for` ループを使った配列要素の全件処理

配列の中身を、最初から最後まで順番に処理したい、という場面は非常によくあります。

例えば、配列に入っている点数を全部合計するとか、全部表示するとかですね。
そんな時は、forループ、特にfor...range構文を使うのが便利です。

for...rangeを使うと、配列のインデックスと値を順番に取り出してくれます。

書き方

package main

import "fmt"

func main() {
    scores := [...]int{85, 92, 78}

    // インデックス(i)と値(v)を両方使う場合
    fmt.Println("インデックスと点数:")
    for i, v := range scores {
        fmt.Printf(" %d番目の点数: %d\n", i, v) // %dは整数を表示するおまじない
    }

    // 値(v)だけ使う場合 (インデックスは _ で捨てる)
    fmt.Println("\n点数だけ:")
    total := 0 // 合計点を計算するための変数
    for _, v := range scores {
        fmt.Printf(" %d点\n", v)
        total = total + v // 合計に加算
    }

    fmt.Printf("\n合計点: %d\n", total)
}

ソースコードの表示結果

インデックスと点数:
 0番目の点数: 85
 1番目の点数: 92
 2番目の点数: 78

点数だけ:
 85点
 92点
 78点

合計点: 255

インデックスが不要な場合は、_(アンダースコア)を使って無視することができます。
for...rangeは、配列の中身を順番に見る定番の方法として覚えておきましょう!

配列の長さを取得する (`len` 関数)

配列にいくつの要素が入っているか(配列の長さ)を知りたい時があります。

そんな時は、Go言語に用意されているlen()という関数を使います。
使い方は簡単で、len(配列名)と書くだけです。

書き方

package main

import "fmt"

func main() {
    colors := [...]string{"Red", "Green", "Blue", "Yellow"}

    // 配列の長さを取得
    length := len(colors)

    fmt.Printf("配列colorsの長さは %d です。\n", length) // %dは整数を表示

    // len() を使って for ループを書くこともできる
    fmt.Println("色を順番に表示:")
    for i := 0; i < len(colors); i++ {
        fmt.Printf(" %d: %s\n", i, colors[i]) // %sは文字列を表示
    }
}

ソースコードの表示結果

配列colorsの長さは 4 です。
色を順番に表示:
 0: Red
 1: Green
 2: Blue
 3: Yellow

len()を使えば、配列の要素数を簡単に取得できますね。

forループと組み合わせる時にもよく使われます。配列の長さを知りたい時に使うのがlen()関数です。

Go言語の配列を使うときの注意点

Go言語の配列はシンプルで使いやすいですが、いくつか知っておきたい注意点があります。

これを知らないと、思わぬところで「あれ?」となるかもしれないので、しっかり押さえておきましょう。

【注意点1】配列は「固定長」である

最初にも触れましたが、これは本当に大事なポイントなので、もう一度。

Go言語の配列は、一度決めたらサイズ(要素数)は変えられない、固定長です。
宣言時に[5]と決めたら、永遠に5個の要素しか持てません。後から要素を追加して6個にしたり、削除して4個にしたりすることはできません。

もし、プログラムの実行中に要素の数を変えたい、自由に追加したり削除したりしたい場合は、配列ではなく「スライス」という別の仕組みを使います。(スライスについては、また別の機会に!)

「最初に決めた箱の数は後から変えられません!」と覚えておきましょう。

【注意点2】配列は「値渡し」である

少し難しい話かもしれませんが、これもGo言語の配列の大きな特徴です。

配列を他の変数に代入したり、関数の引数(関数に渡す値)として使ったりすると、配列の中身全体がまるごとコピーされて渡されます。これを「値渡し」といいます。

どういうことか、例を見てみましょう。

書き方

package main

import "fmt"

func main() {
    // 配列を宣言して初期化
    arrayA := [3]int{1, 2, 3}

    // 配列Aを配列Bに代入(ここでコピーが発生!)
    arrayB := arrayA

    // 配列Bの最初の要素を変更
    arrayB[0] = 100

    // 配列Aと配列Bを表示してみる
    fmt.Println("配列A:", arrayA) // 元の配列Aは変わらない
    fmt.Println("配列B:", arrayB) // コピーされた配列Bだけが変わる
}

ソースコードの表示結果

配列A: [1 2 3]
配列B: [100 2 3]

配列Bの値を変更しても、元の配列Aには影響がありませんね。

これは、arrayB := arrayAのところで、arrayAの完全なコピーが作られてarrayBになったからです。
コピーが作られて渡されるという点を覚えておいてください。特に大きな配列を扱う場合、コピーに時間がかかる可能性もあります。

【まとめ】Go言語の配列を確実にマスターしよう!

Go言語の配列について、宣言の方法から基本的な使い方、注意点まで一通り見てきました。

ポイントを振り返ってみましょう。

  • 配列は、同じ種類のデータを複数まとめておくための「固定長」の箱。
  • 宣言はvar 名前 [数]型が基本。
  • := [数]型{値...}:= [...]型{値...}で宣言と初期化を同時にできる(リテラル記法)。
  • 要素へのアクセスは配列名[インデックス](インデックスは0から!)。
  • 全体の処理にはfor...rangeが便利。
  • 長さはlen(配列名)で取得。
  • 注意点は「固定長」と「値渡し」。

最初は少し難しく感じるかもしれませんが、実際にコードを書いて動かしてみるのが一番の近道です。

この記事のサンプルコードを参考に、ぜひ色々試してみてください。

Go言語の配列を使いこなせるようになれば、書けるプログラムの幅がぐっと広がりますよ!
自信を持って、どんどんコードを書いていきましょう!

【関連記事】 Go言語とは?特徴・できること・将来性

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ