Zoeken…


Schakel verklaringen uit

Een eenvoudige switch :

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

Het bovenstaande voorbeeld is gelijk aan:

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

De default is optioneel en wordt uitgevoerd als en alleen als geen van de gevallen waar vergelijkt, zelfs als deze niet als laatste verschijnt, wat acceptabel is. Het volgende is semantisch hetzelfde als het eerste voorbeeld:

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

Dit kan handig zijn als u van plan bent de fallthrough instructie in de default te gebruiken, die de laatste instructie in een case moet zijn en ervoor zorgt dat het programma wordt uitgevoerd naar de volgende case:

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

Een lege schakeluitdrukking is impliciet true :

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

Switch-instructies ondersteunen een eenvoudige instructie die lijkt op if instructies:

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

Cases kunnen worden gecombineerd in een door komma's gescheiden lijst als ze dezelfde logica delen:

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

Als verklaringen

Een eenvoudige if verklaring:

if a == b {
    // do something
}

Merk op dat er geen haakjes rondom de aandoening staan en dat de krullende accolade { op dezelfde lijn moet staan. Het volgende wordt niet gecompileerd:

if a == b
{
    // do something
}

Een if instructie die else :

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

Volgens de documentatie van golang.org : "De uitdrukking kan worden voorafgegaan door een eenvoudige verklaring, die wordt uitgevoerd voordat de uitdrukking wordt geëvalueerd." Variabelen die in deze eenvoudige instructie worden gedeclareerd, vallen onder de if instructie en zijn niet toegankelijk buiten de instructie:

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

Type schakelaarverklaringen

Een eenvoudige typeschakelaar:

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

U kunt testen voor elk type, inclusief error , door de gebruiker gedefinieerde typen, interfacetypen en functietypen:

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

Ga naar verklaringen

Een goto instructie draagt de controle over aan de instructie met het bijbehorende label binnen dezelfde functie. Het uitvoeren van de goto instructie mag geen variabelen binnen bereik brengen die nog niet binnen het bereik van de goto stonden.

zie bijvoorbeeld de standaardbroncode van de bibliotheek: 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 verklaringen

De instructie break maakt bij uitvoering de huidige lus om exit te forceren

pakket hoofd

import "fmt"

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

De instructie continue, bij uitvoering, verplaatst het besturingselement naar het begin van de lus

import "fmt"

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

Breek / ga door lus in schakelaar

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow