Go言語の制御文(if、for、switch)
この記事ではGo言語における制御文の使い方を紹介します!
Go言語のプロジェクト作成方法やデバッグ方法についてはこちらの記事を参考にしてください。
制御文とは?
まずはGo言語に限らず、プログラム言語ならほぼ全てに存在するであろう制御文について簡単に説明します。
制御文とは、「プログラムの動き(処理の流れ)を制御するための文」です。
この制御文を使うことで、以下のような制御を行うことができるようになります。
- 条件によって処理を切り替える
- 同じ処理を複数回繰り返す、または繰り返しから抜ける
- ...etc
具体的な制御文の使い方と特徴をサンプルコードと共に詳しく解説します!
if文(条件分岐)
Go言語のif
文は、条件が合致する時に特定の処理を実行するための構文です。
他のプログラミング言語でも見られるif
文と似ていますが、Go特有の書き方も存在します。
if文の基本構文と特徴
if 条件式 {
// 条件が true の場合の処理
}
Goのif
文には、いくつか特徴的なルールと記述方法が存在します。
- カッコを省略:条件式のカッコが不要です。他の言語では、
if (condition)
のようにカッコで条件を囲むのが一般的ですが、Goではシンプルにif condition
と書きます。 - 初期化文(Initial Statement):
if
文の中で初期化文を宣言し、同時に条件式を評価できます。この記法は一時的な変数を扱う際に便利です。
if x := 10; x > 5 {
fmt.Println("xは5より大きいです")
}
上記のコードでは、x
はif
ブロック内でのみ有効であり、他のスコープには影響しません。
つまり、スコープ管理がしやすく、意図しない影響を避けることができます。
ただ、実際の開発ではif
ブロック外の値を条件分岐させることが多いので、あまり出番は無いかもしれません。
else
やelse if
の扱い:Goでは、else
およびelse if
文を使って複数の条件を評価できます。else
とif
は必ず同じ行に書く必要があり、これによって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文のサンプルコード
上記までのサンプルコードは実際には関数内に記述しなければいけないため、そのままでは動きません。
パッケージの宣言、関数の宣言も行った全体のサンプルコードを以下に記述します。
試しに動かしてみてください!
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
文しか存在しません。
他言語では用意されているwhile
やdo-while
といった構文は、Go言語にはありませんが、for
文の書き方を変えることで多様なループ処理を行うことができます。
また、ループ内で使用されるbreak
やcontinue
を活用することで、条件に応じたループの制御が可能です。
for文の基本構文と特徴
for 初期化文; 条件式; 更新文 {
// 繰り返し処理
}
Goのfor
文は、以下のように柔軟に使うことができます。
- 標準的なループ:初期化文、条件式、更新文の3つを使った標準的なループです。
これにより、特定の範囲で繰り返し処理を行うことができます。
for i := 0; i < 5; i++ {
fmt.Println(i)
}
- 無限ループ:
for
文に条件式を省略すると、無限ループを表現できます。
例えば、サーバーが停止するまで待機させたり、ユーザー入力を常に受け付けるような場面で使います。
for {
fmt.Println("無限ループします")
}
- 条件付きループ:
while
のように、条件がtrue
である限りループを続ける構造も、for
文で表現できます。
初期化文と更新文を省略し、条件式だけを残すことで、指定した条件でのループ処理が可能です。
i := 0
for i < 5 {
fmt.Println(i)
i++
}
range
を使用したループ:配列やスライス、マップ、文字列などを扱う際にrange
キーワードを使って簡潔にループを回せます。
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
を使ってスキップしています。
package main
import "fmt"
func main() {
for i := 1; i <= 10; i++ {
if i%2 != 0 {
continue
}
fmt.Println(i)
}
}
実行結果
2
4
6
8
10
switch文(条件分岐)
Go言語のswitch
文は、特定の条件に基づいて処理を分岐させるために使われます。
Goのswitch
は、他の言語と同様の動きをしますが、より柔軟で便利な書き方が可能です。
先述したif
文と同様に条件分岐した処理を書くことができますが、if
文だとelse if
が多くなってしまう場合などにswitch
文を使うと可読性が良くなります。
switch文の基本構文と特徴
switch 式 {
case 値1:
// 値1に一致した場合の処理
case 値2:
// 値2に一致した場合の処理
default:
// どれにも一致しない場合の処理
}
switch
文には以下のような特徴があります。
- 条件式の省略:Goの
switch
文は、条件式を省略して使うことができます。
この場合、各case
はtrue
になるかどうかに基づいて評価されます。
switch {
case num > 0:
fmt.Println("正の数です")
case num < 0:
fmt.Println("負の数です")
default:
fmt.Println("ゼロです")
}
- 複数の条件を同時に記述:1つの
case
句に対して複数の値を指定することができます。
値をカンマで区切って並べると、複数の条件を1行で書けるので、コードがよりシンプルになります。
day := "土"
switch day {
case "土", "日":
fmt.Println("今日は週末です")
default:
fmt.Println("平日です")
}
fallthrough
キーワード:Goのswitch
文はデフォルトで「フォールスルーしない(次のcaseに処理を引き継がない)」です。
しかしfallthrough
キーワードを使うことで、次のcase
に処理を渡すことができます。
以下のサンプルコードでは、case 2に入った後にfallthrough
によりcase 3に入り、さらにcase 3のfallthrough
によりdefaultの処理を行うことになります。
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")
}
実行結果
Two
Three
Other
switch文のサンプルコード
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
などの使い方を覚えると、より効率的でわかりやすいコードを記述することができます。