Go言語 プログラミング

Go言語の制御文(if、for、switch)

2024年11月4日

Go言語の制御文(if、for、switch)

gopher
by Renée French

この記事ではGo言語における制御文の使い方を紹介します!
Go言語のプロジェクト作成方法やデバッグ方法についてはこちらの記事を参考にしてください。

制御文とは?

まずはGo言語に限らず、プログラム言語ならほぼ全てに存在するであろう制御文について簡単に説明します。

制御文とは、「プログラムの動き(処理の流れ)を制御するための文」です。

この制御文を使うことで、以下のような制御を行うことができるようになります。

  • 条件によって処理を切り替える
  • 同じ処理を複数回繰り返す、または繰り返しから抜ける
  • ...etc

具体的な制御文の使い方と特徴をサンプルコードと共に詳しく解説します!

if文(条件分岐)

Go言語のif文は、条件が合致する時に特定の処理を実行するための構文です。
他のプログラミング言語でも見られるif文と似ていますが、Go特有の書き方も存在します。

if文の基本構文と特徴

Go
if 条件式 {
    // 条件が true の場合の処理
}

Goのif文には、いくつか特徴的なルールと記述方法が存在します。

  • カッコを省略:条件式のカッコが不要です。他の言語では、if (condition)のようにカッコで条件を囲むのが一般的ですが、Goではシンプルにif conditionと書きます。
  • 初期化文(Initial Statement)if文の中で初期化文を宣言し、同時に条件式を評価できます。この記法は一時的な変数を扱う際に便利です。
Go
if x := 10; x > 5 {
    fmt.Println("xは5より大きいです")
}

上記のコードでは、xifブロック内でのみ有効であり、他のスコープには影響しません。
つまり、スコープ管理がしやすく、意図しない影響を避けることができます。

ただ、実際の開発ではifブロック外の値を条件分岐させることが多いので、あまり出番は無いかもしれません。

  • elseelse ifの扱い:Goでは、elseおよびelse if文を使って複数の条件を評価できます。elseifは必ず同じ行に書く必要があり、これによってGoのコードスタイルが一貫されるので可読性が良くなります。
Go
num := 8

if num > 10 {
    fmt.Println("numは10より大きい")
} else if num == 10 {
    fmt.Println("numは10です")
} else {
    fmt.Println("numは10未満です")
}

上記のコードでは、ifブロック外で宣言したnumの値を条件分岐で判定しています。
num > 10 と num = 10 のどちらにも当てはまらないため、最後のelse内の処理が実行されます。

if文のサンプルコード

上記までのサンプルコードは実際には関数内に記述しなければいけないため、そのままでは動きません。
パッケージの宣言、関数の宣言も行った全体のサンプルコードを以下に記述します。
試しに動かしてみてください!

Go
package main

import "fmt"

func main() {
    var num int
    fmt.Print("数値を入力してください: ")
    fmt.Scan(&num)

    if num > 0 {
        fmt.Println("正の数です")
    } else if num < 0 {
        fmt.Println("負の数です")
    } else {
        fmt.Println("ゼロです")
    }
}

for文(繰り返し文)

Go言語には唯一のループ構造であるfor文しか存在しません。
他言語では用意されているwhiledo-whileといった構文は、Go言語にはありませんが、for文の書き方を変えることで多様なループ処理を行うことができます。
また、ループ内で使用されるbreakcontinueを活用することで、条件に応じたループの制御が可能です。

for文の基本構文と特徴

Go
for 初期化文; 条件式; 更新文 {
    // 繰り返し処理
}

Goのfor文は、以下のように柔軟に使うことができます。

  • 標準的なループ:初期化文、条件式、更新文の3つを使った標準的なループです。
    これにより、特定の範囲で繰り返し処理を行うことができます。
Go
for i := 0; i < 5; i++ {
    fmt.Println(i)
}
  • 無限ループfor文に条件式を省略すると、無限ループを表現できます。
    例えば、サーバーが停止するまで待機させたり、ユーザー入力を常に受け付けるような場面で使います。
Go
for {
    fmt.Println("無限ループします")
}
  • 条件付きループwhileのように、条件がtrueである限りループを続ける構造も、for文で表現できます。
    初期化文と更新文を省略し、条件式だけを残すことで、指定した条件でのループ処理が可能です。
Go
i := 0
for i < 5 {
    fmt.Println(i)
    i++
}
  • rangeを使用したループ:配列やスライス、マップ、文字列などを扱う際にrangeキーワードを使って簡潔にループを回せます。
Go
nums := []int{1, 2, 3, 4, 5}
for index, value := range nums {
    fmt.Printf("Index: %d, Value: %d\n", index, value)
}

for文のサンプルコード

for文の全体サンプルコードです。
こちらも試してみましょう!

次の例では、1から10までの数値のうち、偶数のみを出力します。奇数のときはcontinueを使ってスキップしています。

Go
package main

import "fmt"

func main() {
    for i := 1; i <= 10; i++ {
        if i%2 != 0 {
            continue
        }
        fmt.Println(i)
    }
}

実行結果

Bash
2
4
6
8
10

switch文(条件分岐)

Go言語のswitch文は、特定の条件に基づいて処理を分岐させるために使われます。
Goのswitchは、他の言語と同様の動きをしますが、より柔軟で便利な書き方が可能です。

先述したif文と同様に条件分岐した処理を書くことができますが、if文だとelse ifが多くなってしまう場合などにswitch文を使うと可読性が良くなります。

switch文の基本構文と特徴

Go
switch 式 {
case 値1:
    // 値1に一致した場合の処理
case 値2:
    // 値2に一致した場合の処理
default:
    // どれにも一致しない場合の処理
}

switch文には以下のような特徴があります。

  • 条件式の省略:Goのswitch文は、条件式を省略して使うことができます。
    この場合、各casetrueになるかどうかに基づいて評価されます。
Go
switch {
case num > 0:
    fmt.Println("正の数です")
case num < 0:
    fmt.Println("負の数です")
default:
    fmt.Println("ゼロです")
}
  • 複数の条件を同時に記述:1つのcase句に対して複数の値を指定することができます。
    値をカンマで区切って並べると、複数の条件を1行で書けるので、コードがよりシンプルになります。
Go
day := "土"

switch day {
case "土", "日":
    fmt.Println("今日は週末です")
default:
    fmt.Println("平日です")
}
  • fallthroughキーワード:Goのswitch文はデフォルトで「フォールスルーしない(次のcaseに処理を引き継がない)」です。
    しかしfallthroughキーワードを使うことで、次のcaseに処理を渡すことができます。

    以下のサンプルコードでは、case 2に入った後にfallthroughによりcase 3に入り、さらにcase 3のfallthroughによりdefaultの処理を行うことになります。
Go
num := 2

switch num {
case 1:
    fmt.Println("One")
case 2:
    fmt.Println("Two")
    fallthrough
case 3:
    fmt.Println("Three")
    fallthrough
default:
    fmt.Println("Other")
}

実行結果

Bash
Two
Three
Other

switch文のサンプルコード

Go
package main

import "fmt"

func main() {
    var day string
    fmt.Print("曜日を入力してください: ")
    fmt.Scan(&day)

    switch day {
    case "月":
        fmt.Println("今日は月曜日です")
    case "火":
        fmt.Println("今日は火曜日です")
    case "水":
        fmt.Println("今日は水曜日です")
    default:
        fmt.Println("指定された曜日は対応していません")
    }
}

おわりに

Go言語のif文、for文、switch文は、いずれもシンプルで非常にわかりやすいかと思います。

特にGo独自の構文として、switch文のfallthroughや、for文での条件付きループ、無限ループやcontinueなどの使い方を覚えると、より効率的でわかりやすいコードを記述することができます。

参考記事

https://go.dev/doc/effective_go

  • この記事を書いた人
  • 最新記事

kuron

Webやモバイルアプリ開発しているエンジニア。 プログラミングや動画編集、ガジェットなどの雑談系の話もブログにしていきます!

-Go言語, プログラミング
-,