Golang多重条件文Switch構文の詳細

4470 ワード

SwitchはGo言語の多重条件文で、case文と組み合わせて一般的に使用されています.
じっこうロジック
1つのswitch case条件構造は以下の通りである.
switch simpleStatement; condition {
    case expression1,expression2:
        statements
    case expression3:
        statements
    default:
        statements
    }

if文と似ていますが、switch文は、条件文の前に短い式(変数を簡単に制御できる役割ドメイン)を実行することもできます.switch caseが実行を開始すると、この式が先に実行されます.(空も1種)を計算し、条件文の値を算出し、上から下、左から右の順に1つずつcase文を実行する条件式を行い、値が等しい場合はcase条件の下で対応する文に入ります.すべてのcase条件が一致していない場合はdefaultの下で対応する論理を実行しようとします.
ケース条件連結
複数のcase条件に対応する処理ロジックが同じ場合,Go言語におけるcase条件はマージ可能であり,複数の条件はカンマで区切られ,判断順序は左から右である.
func main()  {
    switch runtime.GOOS {
    case "linux","darwin" :
        println("unix  ")
    case "windows":
        println("windows  ")
    }
}

サポートされるタイプ
Javaが整数のみをサポートして判断するのではなく(他のタイプは整数に変換することによって実現される)、Goの中のswitchのパラメータは式であり、任意のタイプの比較をサポートし、switchの条件は空であってもよく、このときswitch trueに等価であり、複数のif条件のシーンを簡略化するために使用することができる.
func price(weight int) int  {
    if weight > 10 {
        return 100
    } else if weight > 8 {
        return 110
    } else if weight > 5 {
        return 120
    } else {
        return 150
    }
}

たとえば、上の多重if else判定ロジックは、下のパラメータのないswitch case文で置き換えることができます.
func price(weight int) int  {
    switch  {
    case weight>10:
        return 100
    case weight>8:
        return 110
    case weight>5:
        return 120
    default:
        return 150
    }
}


暗黙break&fallthrough
Go言語で1つのcase条件に一致して対応する論理を実行すると、このswitch文が飛び出し、各case処理論理の後に暗黙的なbreak文が追加されたことに等しい.暗黙的に終了したくない場合はfallthrough文を使用して次のcaseの処理ロジックを続行します.暗黙break:
func main()  {
    switch runtime.GOOS {
    case "linux","darwin" :
        println("unix  ")
    case "windows":
        println("window  ")
    default:
        println("     ")
    }
}

出力:
windows  

強制fallthrough:
func main()  {
    switch runtime.GOOS {
    case "linux","darwin" :
        println("unix  ")
        fallthrough
    case "windows":
        println("windows  ")
        fallthrough //           
    default:
        println("     ")
    }
}

出力:
windows  
     

しかし、この点は他の多くのプログラミング言語とは正反対です.例えば、Java、C++です.JavaとC++のswitch caseはいずれも暗黙的fallthroughであり、breakは呼び出しを表示する必要がある.この2つの方法にはそれぞれメリットとデメリットがあるだろう.やはり異なる使用シーンを見るが、Java 12には暗黙的breakのサポートも加わっている.またGo言語でも呼び出しbreakが事前に飛び出したことを表示することができますが、使い方はループ文のbreakと同じで、ラベルを付けて具体的などの論理から飛び出したかを指定することもできます.break明示的なジャンプ:
func main() {
    x := []int{1,2,3,4,5}
    for _, i := range x {
        switch  {
        case i>0 :
            if i > 1 && i < 3 {
                break
            }
            println(i)
        }
    }
}

出力:
1
3
4
5

ラベルジャンプforループを指定します.
func main() {
    x := []int{1,2,3,4,5}
    a:
    for _, i := range x {
        switch  {
        case i>0 :
            if i > 1 && i < 3 {
                break a
            }
            println(i)
        }
    }
}

出力:
1

Type Switch
Go言語のswitch条件は、1つの変数が複数のタイプである可能性がある場合に非常に有用なタイプであってもよいが、if elseにタイプ断言を加えて実現することもできる.
func main() {
    i := interface{}(123)
    if _,ok := i.(int);ok{
        println("int")
    }else if _,ok := i.(int64);ok {
        println("int64")
    }else if _,ok := i.(string);ok {
        println("string")
    }
}

しかし、Type Switchを使用するとコードがより簡潔になります.例えば、上記の論理はType Switchで書き換えられます.
func main() {
    i := interface{}(123)
    switch i.(type) {
    case int:
        println("int")
    case int64:
        println("int64")
    case float64:
        println("float64")
    }
}

出力:
int

(注:123はint 64ではなくintタイプです.変数を明示する際に特定のタイプが指定されていないため、コンパイラは自分でタイプを導き、intはタイプなし整形のデフォルトタイプです.)同時にType Switchは変数に値を与えることができ、この変数は異なるcaseでcase条件に対応するタイプになります.(case文をマージすると無効になります)
func main() {
    var i interface{}
    switch x := i.(type) {
    case error:
        x.Error()
    case fmt.Stringer:
        x.String()
    }
}

原文は次のとおりです.https://huweicai.com/go-switch/