HOWTO · Go
Cの三項演算子に相当する慣用的なGoの書き方
このチュートリアルでは、if-else文を使用して、Cの三項演算子に相当する慣用的なGoの書き方を解説します。明確な例と説明を通じて、Goで条件ロジックを実装する方法を学びます。可読性と保守性を重視するGoの設計哲学の利点を知ることで、コードがより理解しやすくなります。
このページの内容
Goには三項演算子がありません。条件から値を選択するには、if/else文を使用し、各分岐で結果を代入します。これにより、決定が制御フローとして見える形に保たれ、文が許可される場所であればどこでも機能します。
Cの三項演算子の動作
Cの条件演算子は condition ? true_expression : false_expression という形式を使用します。オペランドは3つあります:条件と、結果を提供する2つの式です。Cは条件を評価し、それが真の場合は ? の後の式を、偽の場合は : の後の式を評価します。たとえば、int b = (a > 3) ? 10 : 20; は、a が3より大きい場合に b に10を代入し、そうでない場合に20を代入します。
その形式は式であるため、より大きな式の内部や代入の右辺に現れることができます。Goには意図的に、それに相当するインライン条件式がありません。Goの if 文は文であるため、Goへの翻訳では、Cが式を期待する場所に if を置こうとするのではなく、分岐の中に代入を配置します。
Goでif-elseを使用する
次の完全なプログラムは、Cの代入を翻訳し、ブール条件から1または0を代入する方法も示します。短い宣言 a := 5 は a を作成して初期化します;var b int は、どちらの分岐が代入するよりも前に b を宣言します。else 分岐は、if 分岐の閉じ括弧に付ける必要があります。a を変更して、各決定がどの値を代入するかを確認してください。
package main
import "fmt"
func main() {
a := 5
var b int
if a > 3 {
b = 10
} else {
b = 20
}
var isLarge int
if a > 3 {
isLarge = 1
} else {
isLarge = 0
}
fmt.Println(b)
fmt.Println(isLarge)
}
10
1
最初の決定は10と20の間で選択し、Cの代入と一致します。2番目は条件を整数フラグに変換します。これらは各分岐における通常の代入です。上の出力は、プログラムが出力した値を示しています。
if には、if n := len(items); n > 0 { ... } のような初期化文を含めることもできます。そこで宣言された変数は、その if 文とその else 分岐に限定されます。この形式は、その値がその決定にのみ必要な場合に使用してください;そうでない場合は、後のコードが使用できるよう、文の前に宣言してください。
Goで複数の条件を扱う
決定に2つより多くの結果がある場合、if/else if の連鎖により順序が明示的になります。Goは条件を上から下にチェックし、最初に一致した分岐を実行します;最後の else が残りのすべての値を処理します。特に、ある条件が別の条件に一致する値を含む場合は、最も有用な区別を明確な順序で配置してください。
1つの式の相互に排他的な複数の値については、switch の方が長い連鎖よりも見通しやすい場合があります。従来のswitchは、1つの値をその case 値と比較します。Goでは式のない switch も許可されており、各 case にブール条件を含めます。これは if/else if の連鎖に似ています。たとえば、switch { case score >= 90: grade = "A"; case score >= 80: grade = "B"; default: grade = "C" } は順序付きの範囲を表します。フォーマットされたGoソースでは、可読性のために各caseの本体を独自の行に配置してください。
switchもifの連鎖も三項式ではありません:どちらも、どの文を実行するかを制御する文です。小さな決定や順序付きの条件には if/else を選択し、複数のケースをグループ化することで選択肢が理解しやすくなる場合は switch を選択してください。switchは選択肢の1つであり、普遍的により優れた代替手段ではありません;決定の形が選択の指針となるべきです。
FAQ
Cの三項演算子とは何ですか?
これはCの条件演算子で、condition ? true_expression : false_expression と書かれます。条件が2つの結果式のうち1つを選択します。
Goには三項演算子がありますか?
いいえ。Goは条件ロジックに if/else 文を使用します。代入や関数の引数の中で、if 文をインライン式として使用することはできません。
Goでネストしたif-else文を使用できますか?
はい。複数の結果については、各 if を別の if の中にネストするよりも、else if の連鎖の方がたどりやすいことがよくあります。どちらの形式も文であり、各分岐は値を代入したり、他の作業を実行したりできます。
代わりにswitchを使用すべきなのはいつですか?
ケースが明確な代替案の集合を形成する場合、または式のないswitchにより複数の関連する条件が読みやすくなる場合に switch を使用してください。順序付きの比較の方が決定をより直接的に伝える場合は、if/else if の連鎖を使用してください。
実用的な翻訳は、条件とその代替案を明示的に保つことです:Cコードを読むときはCの ?: を使用し、対応するGoの制御フローにはGoの if/else 文または switch 文を使用してください。