Suche…


Wechseln Sie die Anweisungen

Eine einfache switch Anweisung:

switch a + b {
case c:
    // do something
case d:
    // do something else
default:
    // do something entirely different
}

Das obige Beispiel ist äquivalent zu:

if a + b == c {
    // do something
} else if a + b == d {
    // do something else
} else {
    // do something entirely different
}

Die default ist optional und wird nur dann ausgeführt, wenn keine der Fälle wahr ist, auch wenn sie nicht zuletzt default wird. Dies ist akzeptabel. Das folgende ist semantisch dasselbe wie beim ersten Beispiel:

switch a + b {
default:
    // do something entirely different
case c:
    // do something
case d:
    // do something else
}

Dies kann nützlich sein, wenn Sie die fallthrough Anweisung in der default verwenden fallthrough , die die letzte Anweisung in einem Fall sein muss und dazu führt, dass die Programmausführung zum nächsten Fall fallthrough :

switch a + b {
default:
    // do something entirely different, but then also do something
    fallthrough
case c:
    // do something
case d:
    // do something else
}

Ein leerer Schalterausdruck ist implizit true :

switch {
case a + b == c:
    // do something
case a + b == d:
    // do something else
}

Switch-Anweisungen unterstützen eine einfache Anweisung ähnlich der if Anweisung:

switch n := getNumber(); n {
case 1:
    // do something
case 2:
    // do something else
}

Fälle können in einer durch Kommas getrennten Liste zusammengefasst werden, wenn sie dieselbe Logik verwenden:

switch a + b {
case c, d:
    // do something
default:
    // do something entirely different
}

Wenn Aussagen

Eine einfache if Anweisung:

if a == b {
    // do something
}

Beachten Sie, dass der Zustand nicht in Klammern steht und dass sich die öffnende geschweifte Klammer { in derselben Zeile befinden muss. Folgendes wird nicht kompiliert:

if a == b
{
    // do something
}

Eine if Anweisung, die else :

if a == b {
    // do something
} else if a == c {
    // do something else
} else {
    // do something entirely different
}

Laut golang.org-Dokumentation "Dem Ausdruck kann eine einfache Anweisung vorangestellt werden, die ausgeführt wird, bevor der Ausdruck ausgewertet wird." In dieser einfachen Anweisung deklarierte Variablen beziehen sich auf die if Anweisung und können nicht außerhalb der Anweisung aufgerufen werden:

if err := attemptSomething(); err != nil {
    // attemptSomething() was successful!
} else {
    // attemptSomething() returned an error; handle it
}
fmt.Println(err) // compiler error, 'undefined: err'

Typwechselanweisungen

Ein einfacher Schalter:

// assuming x is an expression of type interface{}
switch t := x.(type) {
case nil:
    // x is nil
    // t will be type interface{}
case int: 
    // underlying type of x is int
    // t will be int in this case as well
case string:
    // underlying type of x is string
    // t will be string in this case as well
case float, bool:
    // underlying type of x is either float or bool
    // since we don't know which, t is of type interface{} in this case
default:
    // underlying type of x was not any of the types tested for
    // t is interface{} in this type
}

Sie können für jeden Typ testen, einschließlich error , benutzerdefinierte Typen, Schnittstellentypen und Funktionsarten:

switch t := x.(type) {
case error:
    log.Fatal(t)
case myType:
    fmt.Println(myType.message)
case myInterface:
    t.MyInterfaceMethod()
case func(string) bool:
    if t("Hello world?") {
        fmt.Println("Hello world!")
    }
}

Springen Sie Anweisungen

Eine goto Anweisung überträgt die Kontrolle an die Anweisung mit dem entsprechenden Label innerhalb derselben Funktion. Die Ausführung der goto Anweisung darf nicht dazu führen, dass Variablen in den Gültigkeitsbereich fallen, die zum Zeitpunkt des goto noch nicht im Gültigkeitsbereich waren.

Siehe zum Beispiel den Standard-Quellcode der Bibliothek: https://golang.org/src/math/gamma.go :

    for x < 0 {
        if x > -1e-09 {
            goto small
        }
        z = z / x
        x = x + 1
    }
    for x < 2 {
        if x < 1e-09 {
            goto small
        }
        z = z / x
        x = x + 1
    }

    if x == 2 {
        return z
    }

    x = x - 2
    p = (((((x*_gamP[0]+_gamP[1])*x+_gamP[2])*x+_gamP[3])*x+_gamP[4])*x+_gamP[5])*x + _gamP[6]
    q = ((((((x*_gamQ[0]+_gamQ[1])*x+_gamQ[2])*x+_gamQ[3])*x+_gamQ[4])*x+_gamQ[5])*x+_gamQ[6])*x + _gamQ[7]
    return z * p / q

small:
    if x == 0 {
        return Inf(1)
    }
    return z / ((1 + Euler*x) * x) 

Break-Continue-Anweisungen

Die break-Anweisung bewirkt bei Ausführung, dass die aktuelle Schleife das Beenden erzwingt

Paket Haupt

import "fmt"

func main() {
    i:=0
    for true {
      if i>2 {
        break
        }
    fmt.Println("Iteration : ",i)
    i++
    }
}

Die continue-Anweisung bewegt das Steuerelement bei der Ausführung an den Anfang der Schleife

import "fmt"

func main() {
    j:=100
    for j<110 {
     j++
     if j%2==0 {
        continue
        } 
    fmt.Println("Var : ",j)        
    }
}

Schleife im Schalter unterbrechen / fortsetzen

import "fmt"

func main() {
    j := 100

loop:
    for j < 110 {
        j++

        switch j % 3 {
        case 0:
            continue loop
        case 1:
            break loop
        }

        fmt.Println("Var : ", j)
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow