go / expert
Snippet
Beschriftetes Break zum sauberen Verlassen verschachtelter Schleifen
Go kennt kein mehrstufiges break — ein einfaches break verlässt nur die innerste Schleife oder das innerste switch. Ein Label vor der äußeren for-Schleife macht diese ansprechbar: break Outer übergibt die Kontrolle direkt hinter diese Schleife und überspringt alle restlichen Iterationen beider Dimensionen. Dasselbe funktioniert mit continue Label, um direkt zur nächsten äußeren Iteration zu springen. Das ist die idiomatische Alternative zu Flag-Variablen oder einer ausgelagerten Hilfsfunktion, die es nur wegen eines frühen Returns gibt.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package mainimport "fmt"func findPair(rows [][]int, target int) (int, int, bool) {ri, ci := -1, -1found := falseOuter:for i, row := range rows {for j, v := range row {if v == target {ri, ci, found = i, j, truebreak Outer}}}return ri, ci, found}func main() {m := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}r, c, ok := findPair(m, 5)fmt.Printf("found=%v at %d,%d\n", ok, r, c)}
Erklärung
1
Outer:
Ein Anweisungs-Label — beliebiger Bezeichner gefolgt von Doppelpunkt. Es benennt das direkt folgende for, sodass break und continue es ansprechen können.
2
for i, row := range rows {
Die äußere Schleife läuft über die Zeilen; ohne Label würde ein inneres break nur den Spaltendurchlauf beenden.
3
break Outer
Übergibt die Kontrolle in einem Schritt hinter das beschriftete for. Beide Schleifen enden; die festgehaltenen ri, ci bleiben erhalten.
4
return ri, ci, found
Das found-Bool unterscheidet einen echten (0,0)-Treffer vom Sentinel (-1,-1) — ein kleines, aber wichtiges Vertragsdetail.