Go言語の配列とfor文について解説
Go言語の配列処理において、for
文はシンプルながら非常に実用的です。
この記事では、基本的な構文を踏まえながら、配列の要素を効率よく走査する方法を取り上げます。
具体例を通じて、自身の開発環境での活用がしやすくなるよう説明します。
配列の基本構文
配列の宣言と初期化
Goで配列を使う場合、まず型とサイズを指定して宣言します。
例えば、整数型の配列を作りたい場合は、以下のように記述できます。
以下は、整数型の配列を宣言し、初期化する例です。
package main
import "fmt"
func main() {
// 整数型の配列を宣言し、初期化する
var numbers = [5]int{1, 2, 3, 4, 5}
// 配列の内容を出力する
fmt.Println("numbers:", numbers)
}
numbers: [1 2 3 4 5]
配列は固定長のため、サイズを変更することはできません。
また、要素の型が統一されている点に注意してください。
要素へのアクセス方法
配列はインデックスを用いて各要素へアクセスします。
インデックスは0から始まるため、最初の要素はnumbers[0]
で参照できます。
以下の例では、配列の各要素にアクセスして出力する方法を紹介します。
package main
import "fmt"
func main() {
// 配列の宣言と初期化
var fruits = [3]string{"りんご", "ばなな", "みかん"}
// 各要素へインデックスを使ってアクセスし出力する
for i := 0; i < len(fruits); i++ {
fmt.Println("fruits[", i, "]:", fruits[i])
}
}
fruits[ 0 ]: りんご
fruits[ 1 ]: ばなな
fruits[ 2 ]: みかん
各要素へのアクセスは、配列のサイズとインデックスを正確に把握することで、エラーを回避できます。
for文の基本構文
基本のforループ
Go言語のfor
文は、C言語に似た形式で使用でき、初期化子、条件式、後置式を含むループを実行することができます。
以下の例は、基本的なfor
ループの構文を示しています。
package main
import "fmt"
func main() {
// 0から4までの数字を出力するforループ
for i := 0; i < 5; i++ {
fmt.Println("現在の値:", i)
}
}
現在の値: 0
現在の値: 1
現在の値: 2
現在の値: 3
現在の値: 4
初期化子や後置式を柔軟に扱えるため、繰り返し処理にとても便利です。
rangeキーワードの使い方
Goでは、range
キーワードを用いて配列、スライス、マップ、文字列などのデータ構造を簡単に走査できます。
range
を使うと、インデックスと値を自動的に受け取ることができ、コードがシンプルになります。
以下は、range
を用いた配列の走査例です。
package main
import "fmt"
func main() {
// 配列の宣言と初期化
var colors = [3]string{"赤", "青", "緑"}
// rangeを用いて配列の要素を走査する
for index, color := range colors {
fmt.Printf("インデックス %d の色は %s です\n", index, color)
}
}
インデックス 0 の色は 赤 です
インデックス 1 の色は 青 です
インデックス 2 の色は 緑 です
range
を使用することで、ループの記述が簡潔になり、意図する動作を明確に記述することができます。
配列とfor文の実践例
シンプルな配列走査
配列の走査は、基本的なfor
ループまたはrange
を使って実装できます。
ここでは、range
を用いた走査例を示します。
シンプルな実例として、文字列の配列を走査して各要素を出力します。
package main
import "fmt"
func main() {
// 文字列型の配列を宣言し、初期化する
var cities = [4]string{"東京", "大阪", "名古屋", "福岡"}
// rangeを使って配列の各要素を出力する
for i, city := range cities {
fmt.Printf("cities[%d] = %s\n", i, city)
}
}
cities[0] = 東京
cities[1] = 大阪
cities[2] = 名古屋
cities[3] = 福岡
条件付きループの活用
配列を走査する際、条件を付けたループを組むことで、特定の要素のみを処理することが可能です。
次の例では、要素の値がある条件を満たす場合にのみ、処理を実行しています。
コード例と実行結果の解説
以下のサンプルコードは、整数型の配列から偶数の要素だけを出力する例です。
package main
import "fmt"
func main() {
// 整数型の配列を宣言し、初期化する
var numbers = [6]int{10, 15, 20, 25, 30, 35}
// rangeを使用して配列を走査し、偶数の要素のみ出力する
for _, num := range numbers {
// 奇数の場合はスキップ
if num % 2 != 0 {
continue // 条件を満たさない場合は次のループへ
}
fmt.Println("偶数:", num)
}
}
偶数: 10
偶数: 20
偶数: 30
この例では、if
文で偶数かどうかを判定し、奇数の場合はcontinue
でループの次の回に進むようにしています。
シンプルな条件分岐を加えることで、必要な要素だけを効果的に処理できる点が特徴です。
配列操作の応用テクニック
インデックス操作と要素の入れ替え
配列内の要素を入れ替える際は、インデックスを直接指定して値を交換する方法が一般的です。
以下のコード例では、配列内の最初と最後の要素を入れ替えています。
package main
import "fmt"
func main() {
// 文字列型の配列を宣言し、初期化する
var names = [4]string{"佐藤", "鈴木", "高橋", "田中"}
// 配列の最初と最後の要素を入れ替え
names[0], names[len(names)-1] = names[len(names)-1], names[0]
// 入れ替え後の配列を出力する
fmt.Println("入れ替え後のnames:", names)
}
入れ替え後のnames: [田中 鈴木 高橋 佐藤]
インデックスを活用することで、配列内の任意の位置の要素を効率的に操作できます。
複数配列の同時処理
複数の配列を同時に処理する場合、各配列のサイズが同じであることを前提に、同じインデックスで走査するのが一般的です。
以下の例は、二つの配列から同じインデックスの要素を組み合わせて出力する方法を示しています。
package main
import "fmt"
func main() {
// 数値型の配列と文字列型の配列を同時に宣言し、初期化する
var scores = [3]int{80, 90, 75}
var names = [3]string{"山本", "井上", "中村"}
// 配列のサイズが同じである前提で、インデックスを使って走査する
for i := 0; i < len(scores); i++ {
fmt.Printf("%sさんのスコアは %d 点です\n", names[i], scores[i])
}
}
山本さんのスコアは 80 点です
井上さんのスコアは 90 点です
中村さんのスコアは 75 点です
エラー回避のポイント
複数の配列を同時に走査する際、配列のサイズが異なる場合、インデックスの範囲外アクセスが発生するため注意が必要です。
配列のサイズを確認して揃えるか、サイズが異なる場合はmin
関数などを利用して、短い方のサイズに合わせるよう工夫すると安全です。
よくある落とし穴と対策
配列サイズの誤認
配列宣言時に指定したサイズと実際の要素数が異なる場合、思わぬ挙動が発生することがあります。
配列のサイズはコンパイル時に固定されるため、実行時にサイズを変更することができません。
注意点として、要素の追加・削除が頻繁に必要な場合は、配列ではなくスライスの利用を検討してください。
無限ループの注意点
ループを作成する際、条件設定やインクリメントの記述ミスなどにより無限ループに陥るケースがあります。
特にfor
文を使用する場合は、初期化子、条件式、後置式の記述が正しいかどうかを確認することが重要です。
また、range
を使ったループでは、走査対象のデータ構造が変動しないことを前提にしているため、データの更新に伴う無限ループ発生を防ぐため、意図した走査対象になっているかを再確認しましょう。
まとめ
この記事では、配列の宣言や初期化、要素へのアクセス方法に加え、基本的なfor文の使い方やrangeキーワードの利用法、実践例と応用テクニック、さらには落とし穴とその対策について詳しく解説しました。
総括として、配列とfor文を用いた効果的な処理方法と安全なコード運用のポイントが把握できます。
ぜひ記事の内容を参考に、実際のコード作成にチャレンジしてみましょう。