1
0

Go言語のfor文の使い方と注意点

Go言語には、一連のステートメントを繰り返すための強力な制御構文であるfor文があります。この記事では、for文の基本的な使い方から、for-range文、無限ループ、そして注意点について詳しく解説します。

基本的なfor文の使い方

for文は、初期化、条件式、後続処理の3つの部分から構成されます。以下は基本的なfor文の構文です。

goファイル
for i := 0; i < 10; i++ {
    fmt.Println(i)
}
結果
0
1
2
3
4
5
6
7
8
9

条件式のみのfor文

他の言語のwhileループに似た形式で、条件式のみを使ったfor文も可能です。

goファイル
i := 0
for i < 10 {
    fmt.Println(i)
    i++
}

この記法でも0から9までを出力します。

無限ループ

無限ループは、条件式を書かずにforを使用することで実現できます。システムの監視やユーザーの入力待ちなどに使われます。

goファイル
for {
    fmt.Println("Loop")
    break
}

無限ループはbreakもしくはreturnで関数から抜けるまで永遠に続きます。

for-range文

for-rangeループは、Goで配列、スライス、マップ、文字列、その他のコレクションを反復処理する簡潔な方法です。

配列の例

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
スライスの例
goファイル
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
マップの例
goファイル
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

文字列の例

goファイル
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を無駄に消費してしまいます。これを避けるためにスリープ関数やチャネルの操作などを使用してループを制御しましょう。

goファイル
for 条件 {
    time.Sleep(1 * time.Second) 
}

無限ループは極力避ける

無限ループはCPUリソースを大量に消費する可能性があります。どうしても無限ループの実装が必要な場合はスリープ関数などの待機処理と合わせて使いましょう。

スコープに注意

forループで宣言された変数はループの外ではアクセスすることができません。ループ内で宣言した変数をループ外で使用したい場合は、ループの外で予め宣言しておく必要があります。

goファイル
var i int
for i = 0; i < 10; i++ {
   // ループ内の処理
}

for range使用時の変数再利用

for rangeでは同じ変数が何度も再利用されます。そのためループ内でゴルーチンを起動する際に注意が必要です。変数の現在の値をゴルーチンに渡す場合は、値をローカル変数にコピーする、もしくは直接引数として渡す必要があります。

goファイル
for _, v := range values {
    go func(val Type) {
        // valを使用
    }(v)
}

まとめ

Go言語のfor文は非常に強力で柔軟な制御構文です。基本的なfor文からfor-range文、無限ループまで、さまざまな用途に対応できます。ただし、使用する際にはCPUリソースの消費や変数のスコープに注意する必要があります。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0