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言語とは?特徴・できること・将来性


0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。