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 文を使用してください。