Go言語のfor文の使い方と注意点
Go言語には、一連のステートメントを繰り返すための強力な制御構文であるfor文があります。この記事では、for文の基本的な使い方から、for-range文、無限ループ、そして注意点について詳しく解説します。
基本的なfor文の使い方
for文は、初期化、条件式、後続処理の3つの部分から構成されます。以下は基本的なfor文の構文です。
for i := 0; i < 10; i++ {
fmt.Println(i)
}
0
1
2
3
4
5
6
7
8
9
条件式のみのfor文
他の言語のwhileループに似た形式で、条件式のみを使ったfor文も可能です。
i := 0
for i < 10 {
fmt.Println(i)
i++
}
この記法でも0から9までを出力します。
無限ループ
無限ループは、条件式を書かずにforを使用することで実現できます。システムの監視やユーザーの入力待ちなどに使われます。
for {
fmt.Println("Loop")
break
}
無限ループはbreakもしくはreturnで関数から抜けるまで永遠に続きます。
for-range文
for-rangeループは、Goで配列、スライス、マップ、文字列、その他のコレクションを反復処理する簡潔な方法です。
配列の例
package main
import "fmt"
func main() {
numbers := [5]int{1, 2, 3, 4, 5}
for i, number := range numbers {
fmt.Println(i, number)
}
}
0 1
1 2
2 3
3 4
4 5
スライスの例
package main
import "fmt"
func main() {
fruits := []string{"apple", "banana", "cherry"}
for i, fruit := range fruits {
fmt.Println(i, fruit)
}
}
出力結果は以下の通りです。
0 apple
1 banana
2 cherry
マップの例
package main
import "fmt"
func main() {
grades := map[string]int{"Alice": 85, "Bob": 90, "Charlie": 95}
for name, grade := range grades {
fmt.Println(name, grade)
}
}
出力結果は以下の通りです(順序は保証されません)。
Alice 85
Bob 90
Charlie 95
文字列の例
package main
import "fmt"
func main() {
message := "Hello, world!"
for i, char := range message {
fmt.Println(i, string(char))
}
}
0 H
1 e
2 l
3 l
4 o
5 ,
6
7 w
8 o
9 r
10 l
11 d
12 !
for文の注意点
空のループはCPUを消費する
何もしない空のループはCPUを無駄に消費してしまいます。これを避けるためにスリープ関数やチャネルの操作などを使用してループを制御しましょう。
for 条件 {
time.Sleep(1 * time.Second)
}
無限ループは極力避ける
無限ループはCPUリソースを大量に消費する可能性があります。どうしても無限ループの実装が必要な場合はスリープ関数などの待機処理と合わせて使いましょう。
スコープに注意
forループで宣言された変数はループの外ではアクセスすることができません。ループ内で宣言した変数をループ外で使用したい場合は、ループの外で予め宣言しておく必要があります。
var i int
for i = 0; i < 10; i++ {
// ループ内の処理
}
for range使用時の変数再利用
for rangeでは同じ変数が何度も再利用されます。そのためループ内でゴルーチンを起動する際に注意が必要です。変数の現在の値をゴルーチンに渡す場合は、値をローカル変数にコピーする、もしくは直接引数として渡す必要があります。
for _, v := range values {
go func(val Type) {
// valを使用
}(v)
}
まとめ
Go言語のfor文は非常に強力で柔軟な制御構文です。基本的なfor文からfor-range文、無限ループまで、さまざまな用途に対応できます。ただし、使用する際にはCPUリソースの消費や変数のスコープに注意する必要があります。