Ricerca…


Switch Statements

Una semplice dichiarazione di switch :

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

L'esempio sopra è equivalente a:

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

La clausola default è facoltativa e verrà eseguita se e solo se nessuno dei casi si confronta con vero, anche se non appare per ultimo, il che è accettabile. Quanto segue è semanticamente uguale al primo esempio:

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

Ciò potrebbe essere utile se si intende utilizzare l'istruzione fallthrough nella clausola default , che deve essere l'ultima istruzione in un caso e fa sì che l'esecuzione del programma passi al caso successivo:

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

Un'espressione switch vuota è implicitamente true :

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

Le istruzioni switch supportano una semplice istruzione simile alle istruzioni if :

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

I casi possono essere combinati in un elenco separato da virgole se condividono la stessa logica:

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

Se le dichiarazioni

Una semplice dichiarazione if :

if a == b {
    // do something
}

Si noti che non ci sono parentesi che circondano la condizione e che la parentesi graffa di apertura { deve essere sulla stessa linea. Quanto segue non verrà compilato:

if a == b
{
    // do something
}

Un'istruzione if che fa uso di else :

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

La documentazione di Per golang.org , "L'espressione può essere preceduta da una semplice istruzione, che viene eseguita prima che l'espressione venga valutata." Le variabili dichiarate in questa semplice istruzione sono associate all'istruzione if e non possono essere accessibili al di fuori di essa:

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

Digitare istruzioni switch

Un semplice interruttore di tipo:

// 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
}

È possibile eseguire test per qualsiasi tipo, inclusi error , tipi definiti dall'utente, tipi di interfaccia e tipi di funzione:

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!")
    }
}

Dichiarazioni Goto

goto trasferisce il controllo all'istruzione con l'etichetta corrispondente all'interno della stessa funzione. L'esecuzione dell'istruzione goto non deve far entrare in campo le variabili che non erano già in ambito al punto del goto .

per esempio vedi il codice sorgente della libreria standard: 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) 

Dichiarazioni Break-continue

L'istruzione break, durante l'esecuzione, rende il loop corrente forzato all'uscita

pacchetto principale

import "fmt"

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

L'istruzione continue, durante l'esecuzione sposta il controllo all'inizio del ciclo

import "fmt"

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

Interruttore di interruzione / continuazione del circuito interno

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow