- Reference: Go 101
Labels
in go is used in break
and continue
statement which is optional but it’s required in goto
statement. The scope of Labels
is the function where it’s declared.
Declare And Definition
A label is declared with format LabelName:
, where the LabelName
is an identifier. A label which name is not a blank identifier must be used at least once time.
Feature
A label must be declared in a function body.
1
2
3
4
5
6
7
8
9
10
11
12
13
14package main
import "fmt"
func main() {
i := 0
Next: // here, a label is declared.
fmt.Println(i)
i++
if i < 5 {
goto Next // execution jumps
}
}A label is not visible/available outside the innermost block which the label is declared.
1
2
3
4
5
6
7
8
9
10
11
12package main
func main() {
goto Label1 // error
{
Label1:
goto Label2 // error
}
{
Label2:
}
}If a label is declared with the scope of variable
a
, the use a label can’t appear before the declaration of variablea
.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package main
import "fmt"
func main() {
i := 0
Next:
if i >= 5 {
// error: jumps over declaration of k
goto Exit
}
k := i + i
fmt.Println(k)
i++
goto Next
// This label is declared in the scope of k,
// but its use is outside of the scope of k.
Exit:
}Fixed way one: shrink the variable scope
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16func main() {
i := 0
Next:
if i >= 5 {
goto Exit
}
// Create an explicit code block to
// shrink the scope of k.
{
k := i + i
fmt.Println(k)
}
i++
goto Next
Exit:
}Fixed way two: enlarge the variable scope
1
2
3
4
5
6
7
8
9
10
11
12
13
14func main() {
var k int // move the declaration of k here.
i := 0
Next:
if i >= 5 {
goto Exit
}
k = i + i
fmt.Println(k)
i++
goto Next
Exit:
}Usage
There are three control flow jump statements,goto, break, continue
, could apply with label
; The goto
statement must follow with label
while break, continue
has option to choice.
goto
Statement with label
The basic format of goto
statement with label
is :
1 | goto label |
In the first part, the usage of goto
has explained, in fact there is no much details could talk with goto
. In practice goto
is not recommend to use. It a easy way to deduct readability and product bug.
break
Statement with label
Generally, break
containing label
is used in nested breakable control flow blocks.
If a break
statement contains a label, the label must be declared just before a breakable control flow block which contains the break
statement. We can view the label name as the name of the breakable control flow block. The break
statement will make execution jump out of the breakable control flow block, even if the breakable control flow block is not the innermost breakable control flow block containing break
statement.
continue
Statement with label
Generally, continue
containing label
is used in nested breakable control flow blocks.
If a continue
statement contains a label, the label must be declared just before a loop control flow block which contains the continue
statement. We can view the label name as the name of the loop control flow block. The continue
statement will end the current loop step of the loop control flow block in advance, even if the loop control flow block is not the innermost loop control flow block containing the continue
statement.
The following is an example of using break
and continue
statements with labels.
1 | package main |