Go 条件制御
Go での条件制御ステートメントは 3 種類あります:if、switch、select。select は他の 2 つと比較して特殊であり、このセクションでは説明せず、並行処理のセクションで改めて紹介します。
if else
if else は最大 2 つの判断分岐を持ちます。ステートメントの形式は以下の通りです。
if expression {
}または
if expression {
}else {
}expression は布尔式でなければなりません。つまり、結果は真または偽のいずれかであり、布尔値である必要があります。例を以下に示します。
func main() {
a, b := 1, 2
if a > b {
b++
} else {
a++
}
}式をより複雑に書くこともできます。必要に応じて可読性を向上させるために、括弧を使用してどの式を優先的に計算するかを明示的に示す必要があります。
func main() {
a, b := 1, 2
if a<<1%100+3 > b*100/20+6 { // (a<<1%100)+3 > (b*100/20)+6
b++
} else {
a++
}
}また、if ステートメントにはいくつかのシンプルなステートメントを含めることもできます。
func main() {
if x := 1 + 1; x > 2 {
fmt.Println(x)
}
}else if
else if ステートメントは if else を基に、より多くの判断分岐を作成できます。ステートメントの形式は以下の通りです。
if expression1 {
}else if expression2 {
}else if expression3 {
}else {
}実行プロセス中、各式の判断は左から右へ、if ステートメント全体の判断は上から下へ行われます。成績に基づいてスコアを付ける例を以下に示します。
最初の書き方:
func main() {
score := 90
var ans string
if score == 100 {
ans = "S"
} else if score >= 90 && score < 100 {
ans = "A"
} else if score >= 80 && score < 90 {
ans = "B"
} else if score >= 70 && score < 80 {
ans = "C"
} else if score >= 60 && score < 70 {
ans = "E"
} else if score >= 0 && score < 60 {
ans = "F"
} else {
ans = "nil"
}
fmt.Println(ans)
}2 番目の書き方は、if ステートメントが上から下に判断するという前提を利用して、コードをより簡潔にしています。
func main() {
score := 90
var ans string
if score >= 0 && score < 60 {
ans = "F"
} else if score < 70 {
ans = "D"
} else if score < 80 {
ans = "C"
} else if score < 90 {
ans = "B"
} else if score < 100 {
ans = "A"
} else if score == 100 {
ans = "S"
} else {
ans = "nil"
}
fmt.Println(ans)
}switch
switch ステートメントも多分岐の判断ステートメントです。ステートメントの形式は以下の通りです。
switch expr {
case case1:
statement1
case case2:
statement2
default:
default statement
}簡単な例を以下に示します。
func main() {
str := "a"
switch str {
case "a":
str += "a"
str += "c"
case "b":
str += "bb"
str += "aaaa"
default: // すべての case に一致しない場合、default 分岐が実行されます
str += "CCCC"
}
fmt.Println(str)
}式の前にいくつかのシンプルなステートメントを記述することもできます。例えば、新しい変数を宣言するなどです。
func main() {
switch num := f(); { // switch num := f(); true { と同等
case num >= 0 && num <= 1:
num++
case num > 1:
num--
fallthrough
case num < 0:
num += num
}
}
func f() int {
return 1
}switch ステートメントには、エントリーポイントの式がない場合もあります。
func main() {
num := 2
switch { // switch true { と同等
case num >= 0 && num <= 1:
num++
case num > 1:
num--
case num < 0:
num *= num
}
fmt.Println(num)
}fallthrough キーワードを使用して、隣接する次の分岐を継続して実行します。
func main() {
num := 2
switch {
case num >= 0 && num <= 1:
num++
case num > 1:
num--
fallthrough // この分岐を実行した後、次の分岐を継続して実行します
case num < 0:
num += num
}
fmt.Println(num)
}label
ラベルステートメントは、コードブロックにラベルを付けます。goto、break、continue のターゲットになります。例を以下に示します。
func main() {
A:
a := 1
B:
b := 2
}ラベルを単独で使用しても意味はありません。他のキーワードと組み合わせて使用する必要があります。
goto
goto は、同一関数内の対応するラベルのステートメントに制御権を移します。例を以下に示します。
func main() {
a := 1
if a == 1 {
goto A
} else {
fmt.Println("b")
}
A:
fmt.Println("a")
}実際のアプリケーションでは、goto はほとんど使用されません。飛び飛びの移動はコードの可読性を低下させ、パフォーマンスの消耗も問題となります。
