Skip to content

Go-Bedingte Steuerung

In Go gibt es drei bedingte Steuerungsanweisungen: if, switch, select. select ist im Vergleich zu den beiden anderen spezieller und wird in diesem Abschnitt nicht behandelt, sondern erst im Abschnitt über Nebenläufigkeit erläutert.

if else

if else hat höchstens zwei Verzweigungen. Das Anweisungsformat lautet wie folgt:

go
if expression {

}

oder

go
if expression {

}else {

}

expression muss ein boolescher Ausdruck sein, d. h. das Ergebnis ist entweder wahr oder falsch, muss ein boolescher Wert sein. Beispiel:

go
func main() {
   a, b := 1, 2
   if a > b {
      b++
   } else {
      a++
   }
}

Der Ausdruck kann auch komplexer gestaltet werden. Bei Bedarf sollten zur Verbesserung der Lesbarkeit Klammern verwendet werden, um explizit anzugeben, was zuerst berechnet werden soll.

go
func main() {
   a, b := 1, 2
    if a<<1%100+3 > b*100/20+6 { // (a<<1%100)+3 > (b*100/20)+6
      b++
   } else {
      a++
   }
}

Die if-Anweisung kann auch einige einfache Anweisungen enthalten, zum Beispiel:

go
func main() {
  if x := 1 + 1; x > 2 {
    fmt.Println(x)
  }
}

else if

Die else if-Anweisung kann auf Basis von if else mehr Verzweigungen erstellen. Das Anweisungsformat lautet wie folgt:

go
if expression1 {

}else if expression2 {

}else if expression3 {

}else {

}

Während der Ausführung wird jeder Ausdruck von links nach rechts bewertet, und die gesamte if-Anweisung wird von oben nach unten bewertet. Hier ein Beispiel für eine Notenzuweisung. Erste Schreibweise:

go
func main() {
   score := 90
   var ans string
   if score == 100 {
      ans = "S"
   } else if score >= 90 && score < 100 {
      ans = "A"
   } else if score >= 80 && score < 90 {
      ans = "B"
   } else if score >= 70 && score < 80 {
      ans = "C"
   } else if score >= 60 && score < 70 {
      ans = "E"
   } else if score >= 0 && score < 60 {
      ans = "F"
   } else {
      ans = "nil"
   }
   fmt.Println(ans)
}

Die zweite Schreibweise nutzt die Voraussetzung, dass die if-Anweisung von oben nach unten bewertet wird, daher ist der Code prägnanter.

go
func main() {
  score := 90
  var ans string
  if score >= 0 && score < 60 {
    ans = "F"
  } else if score < 70 {
    ans = "D"
  } else if score < 80 {
    ans = "C"
  } else if score < 90 {
    ans = "B"
  } else if score < 100 {
    ans = "A"
  } else if score == 100 {
    ans = "S"
    }else {
        ans = "nil"
    }
  fmt.Println(ans)
}

switch

Die switch-Anweisung ist ebenfalls eine Mehrfachverzweigungs-Anweisung. Das Anweisungsformat lautet wie folgt:

go
switch expr {
  case case1:
    statement1
  case case2:
    statement2
  default:
    default statement
}

Ein einfaches Beispiel:

go
func main() {
   str := "a"
   switch str {
   case "a":
      str += "a"
      str += "c"
   case "b":
      str += "bb"
      str += "aaaa"
   default: // Wenn alle case nicht übereinstimmen, wird der default-Zweig ausgeführt
      str += "CCCC"
   }
   fmt.Println(str)
}

Vor dem Ausdruck können auch einige einfache Anweisungen geschrieben werden, z. B. das Deklarieren neuer Variablen:

go
func main() {
  switch num := f(); { // Entspricht switch num := f(); true {
  case num >= 0 && num <= 1:
    num++
  case num > 1:
    num--
    fallthrough
  case num < 0:
    num += num
  }
}

func f() int {
  return 1
}

Die switch-Anweisung kann auch keinen Eingabeausdruck haben.

go
func main() {
   num := 2
   switch { // Entspricht switch true {
   case num >= 0 && num <= 1:
      num++
   case num > 1:
      num--
   case num < 0:
      num *= num
   }
   fmt.Println(num)
}

Mit dem fallthrough-Schlüsselwort kann der nächste Zweig weiter ausgeführt werden.

go
func main() {
   num := 2
   switch {
   case num >= 0 && num <= 1:
      num++
   case num > 1:
      num--
      fallthrough // Nach Ausführung dieses Zweigs wird der nächste Zweig weiter ausgeführt
   case num < 0:
      num += num
   }
   fmt.Println(num)
}

label

Label-Anweisungen weisen einem Codeblock ein Label zu, das Ziel von goto, break oder continue sein kann. Beispiel:

go
func main() {
  A:
    a := 1
  B:
    b := 2
}

Die alleinige Verwendung von Labels ist bedeutungslos und muss mit anderen Schlüsselwörtern kombiniert werden.

goto

goto übergibt die Kontrolle an die Anweisung mit dem entsprechenden Label in der gleichen Funktion. Beispiel:

go
func main() {
   a := 1
   if a == 1 {
      goto A
   } else {
      fmt.Println("b")
   }
A:
   fmt.Println("a")
}

In praktischen Anwendungen wird goto selten verwendet, da das Hin- und Herspringen die Lesbarkeit des Codes verringert und auch ein Problem des Leistungsverbrauchs darstellt.

Golang by www.golangdev.cn edit