はじめに
本記事は全30ステップで学ぶGolangをテーマにしたGolang学習フローのステップ7です。
この記事へ直接訪問された方は、ぜひ下記の記事を参考に自身の理解度をふまえて学習を開始してみてください。
前回までのあらすじ
前回のステップでは、Go言語でのコンソール入出力について学びました。fmt
パッケージを使用して、データの出力方法と、ユーザーからの入力を受け取る方法を習得しました。今回は、これらの知識を活用しながら、プログラムの流れを制御する条件分岐について学んでいきます。
Go言語のif文
条件分岐は、プログラムの実行フローを制御する最も基本的な構造の一つです。Go言語のif文は、シンプルでありながら強力な機能を提供します。
ステップ7では、ステップ5で学んだ 比較演算子
を多く用います。
比較演算子?となった人は戻って復習しましょう!
またGithubからリポジトリをクローンした方は各項目に記載の sampleX
や exercisesX
がコードとリンクしています。
1. 基本的なif文
最も単純な形式のif文は、条件が真の場合にのみ特定のコードブロックを実行します。
まずは一番シンプルな単純な比較と、条件が真の時だけ処理をするコードです。
package main
import "fmt"
func main() {
age := 18
if age >= 18 {
fmt.Println("成人です")
}
}
注意: Go言語では、条件式を括弧()で囲む必要はありません。また、波括弧{}は必須です。
2. if-else文
条件が偽の場合の処理を指定するには、else節を使用します。
条件が偽の時だけ処理をしたい場合はelse節を使い、処理を記載します。
package main
import "fmt"
func main() {
age := 16
if age >= 18 {
fmt.Println("成人です")
} else {
fmt.Println("未成年です")
}
}
偽の時のみ処理が発生する場合は、論理否定演算子のnotを用いて記載量を最小化することもできます。
package main
import "fmt"
func main() {
age := 16
if !(age >= 18) {
fmt.Println("未成年です")
}
}
実際の場合、このケースです論理否定よりも age < 18 としたほうが可読性が高いので、使う場所には注意しましょう。
3. if-else if-else文
複数の条件を順番にチェックする場合は、else if を使用します。
else ifを使用することで「~ではないけど、~の場合」という処理を記載できます。
package main
import "fmt"
func main() {
score := 85
if score >= 90 {
fmt.Println("優秀な成績です")
} else if score >= 80 {
fmt.Println("良い成績です")
} else if score >= 70 {
fmt.Println("普通の成績です")
} else {
fmt.Println("もう少し頑張りましょう")
}
}
この場合、「90以上ではないけど、80以上の場合」という条件が達成されることで「良い成績です」と表示されます。
4. Go言語特有の初期化付きif文
Go言語では、if文の条件式の前に、初期化文を記述することができます。この変数のスコープはif文のブロック内(else節も含む)に限定されます。
package main
import "fmt"
func main() {
if num := 10; num < 0 {
fmt.Printf("%dは負の数です\n", num)
} else if num == 0 {
fmt.Println("ゼロです")
} else {
fmt.Printf("%dは正の数です\n", num)
}
// ここではnumは使用できません
}
ここで定義される変数のスコープはif内部のみというのには注意が必要です。
スコープとは、変数や関数などの名前を参照できる範囲の事を言います。
今回のコードでは、if文の中でのみnum変数を参照できるので、num変数のスコープはif文のブロック内と言えます。
5. エラーハンドリングでのif文の使用
Go言語では、エラーハンドリングにif文を頻繁に使用します。
goのエラーハンドリングはとてもシンプルです。当然エラーが発生した際の処理は、エラーが発生した時のみ実行したいので条件分岐ifが常に使われます。
package main
import (
"fmt"
"strconv"
)
func main() {
if value, err := strconv.Atoi("123"); err != nil {
fmt.Println("変換エラー:", err)
} else {
fmt.Printf("変換成功: %d\n", value)
}
}
初期化ifで書くことで簡素化できますが、errだけでなくvalueもifの中でしか参照できなくなるので、エラー以外の返り値がある関数を呼び出す際は行数は増えますが、次のように丁寧に記載するといいでしょう。
package main
import (
"fmt"
"strconv"
)
func main() {
value, err := strconv.Atoi("123")
if err != nil {
fmt.Println("変換エラー:", err)
} else {
fmt.Printf("変換成功: %d\n", value)
}
}
多くのケースでは、関数から得られた値は直後だけでなく処理内で何度も使われる事が想定されるため、初期化付きifではなく、わけて記載するといいでしょう!
実践的な演習問題
ユーザに年齢を入力してもらい、次の通り判定を表示してください。
ただし、マイナスが入力された場合はエラーメッセージを表示してください。
・0-12歳:子供
・13-17歳:青少年
・18-64歳:成人
・65歳以上:老人
クリックして答えを見る
package main
import (
"fmt"
"log"
)
func main() {
var age int
var err error
fmt.Println("年齢を入力してください")
_, err = fmt.Scan(&age)
if err != nil {
log.Fatalln("生まれた年の入力にエラーがあります:", err)
}
if age < 0 {
fmt.Println("年齢の値が不正です")
}
if age < 13 {
fmt.Println("子供")
} else if age < 17 {
fmt.Println("青少年")
} else if age < 65 {
fmt.Println("成人")
} else {
fmt.Println("老人")
}
}
年齢がマイナスの場合は 0未満の場合
で判定することができます。
ユーザに点数(0-100)を入力してもらい、次の通り判定を表示してください。
ただし、点数が範囲外の場合はエラーメッセージを表示してください。
・90-100:A
・80-89:B
・70-79:C
・60-69:D
・0-59:E
クリックして答えを見る
package main
import (
"fmt"
"log"
"time"
)
func main() {
var score int
var err error
fmt.Println("点数を入力してください")
_, err = fmt.Scan(&score)
if err != nil {
log.Fatalln("点数の入力にエラーがあります:", err)
}
if score < 0 || score > 100 {
fmt.Println("点数の値が不正です")
}
if score > 89 {
fmt.Println("A")
} else if score > 79 {
fmt.Println("B")
} else if score > 69 {
fmt.Println("C")
} else if score > 59 {
fmt.Println("D")
} else {
fmt.Println("E")
}
}
点数のエラーは0より小さいまたは、100より大きいのORを用いることで1度に判定することが出来ます。
サンプルと演習問題の動くコードを公開!
Githubにて各ステップのコードを公開しています。cloneして動かしてみたり、手を入れて理解を深めてください。
ぜひStarでの評価をお願いします!
次のステップへのつながり
条件分岐の基本を理解したことで、プログラムで判断を行い、異なる状況に応じて異なる処理を実行できるようになりました。次のステップでは、論理演算子とより複雑な条件について学びます。これにより、より細かな条件分岐を実装できるようになり、プログラムの制御をさらに柔軟に行えるようになります。
【ステップ8】Go言語の論理演算子とより複雑な条件