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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。