Control Flow
Break and Continue
Use continue to skip one loop pass and break to stop a loop early.
loop control
`continue` jumps to the next iteration, while `break` exits the loop.
Break and Continue
break_continue.go
Replay: real traced execution (multi-file project)
package main
import "fmt"
func main() {
var stopAt = 5
accepted := []int{}
for number := 1; number <= 8; number++ {
if number%2 == 0 {
continue
}
if number > stopAt {
break
}
accepted = append(accepted, number)
}
fmt.Println("stopAt=", stopAt)
fmt.Println("accepted=", accepted)
}
package main
import "fmt"
func main() {
var stopAt = 3
accepted := []int{}
for number := 1; number <= 8; number++ {
if number%2 == 0 {
continue
}
if number > stopAt {
break
}
accepted = append(accepted, number)
}
fmt.Println("stopAt=", stopAt)
fmt.Println("accepted=", accepted)
}
package main
import "fmt"
func main() {
var stopAt = 7
accepted := []int{}
for number := 1; number <= 8; number++ {
if number%2 == 0 {
continue
}
if number > stopAt {
break
}
accepted = append(accepted, number)
}
fmt.Println("stopAt=", stopAt)
fmt.Println("accepted=", accepted)
}
stopAt ← 5, accepted ← []int{}
5func main() {6 var stopAt→ 5 = 5 //@stopAt=3, 77 accepted→ []int{} := []int{}accepted ← []int{1}
pass 1 of 79for number1 := 1; number <= 8; number++ {10 if number%2 == 0 {11 continue12 }13 if number > stopAt {14 break15 }1617 accepted→ []int{1} = append(accepted, number1)18}All 7 passes — pass 1 is the card above pass numberstopAtaccepted1 1 — []int{} → []int{1} 2 2 — — 3 3 — []int{1} → []int{1, 3} 4 4 — — 5 5 — []int{1, 3} → []int{1, 3, 5} 6 6 — — 7 7 5 — if number%2 == 0
pass 1 of 39for number := 1; number <= 8; number++ {10 if number2%2 == 0 {11 continue12 }All 3 passes — pass 1 is the card above pass numberstopAt1 2 — 2 4 — 3 6 5 if number > stopAt
12}13if number7 > stopAt5 {14 break15}fmt.Println("stopAt=", stopAt)
20 fmt.Println("stopAt=", stopAt5)21 fmt.Println("accepted=", accepted[]int{1, 3, 5})22}outputstopAt= 5 accepted= [1 3 5]
stopAt ← 3, accepted ← []int{}
5func main() {6 var stopAt→ 3 = 37 accepted→ []int{} := []int{}accepted ← []int{1}
pass 1 of 59for number1 := 1; number <= 8; number++ {10 if number%2 == 0 {11 continue12 }13 if number > stopAt {14 break15 }1617 accepted→ []int{1} = append(accepted, number1)18}All 5 passes — pass 1 is the card above pass numberstopAtaccepted1 1 — []int{} → []int{1} 2 2 — — 3 3 — []int{1} → []int{1, 3} 4 4 — — 5 5 3 — if number%2 == 0
pass 1 of 29for number := 1; number <= 8; number++ {10 if number2%2 == 0 {11 continue12 }if number%2 == 0
pass 2 of 29for number := 1; number <= 8; number++ {10 if number4%2 == 0 {11 continue12 }if number > stopAt
12}13if number5 > stopAt3 {14 break15}fmt.Println("stopAt=", stopAt)
20 fmt.Println("stopAt=", stopAt3)21 fmt.Println("accepted=", accepted[]int{1, 3})22}outputstopAt= 3 accepted= [1 3]
stopAt ← 7, accepted ← []int{}
5func main() {6 var stopAt→ 7 = 77 accepted→ []int{} := []int{}accepted ← []int{1}
pass 1 of 89for number1 := 1; number <= 8; number++ {10 if number%2 == 0 {11 continue12 }13 if number > stopAt {14 break15 }1617 accepted→ []int{1} = append(accepted, number1)18}All 8 passes — pass 1 is the card above pass numberaccepted1 1 []int{} → []int{1} 2 2 — 3 3 []int{1} → []int{1, 3} 4 4 — 5 5 []int{1, 3} → []int{1, 3, 5} 6 6 — 7 7 []int{1, 3, 5} → []int{1, 3, 5, 7} 8 8 — if number%2 == 0
pass 1 of 49for number := 1; number <= 8; number++ {10 if number2%2 == 0 {11 continue12 }All 4 passes — pass 1 is the card above pass number1 2 2 4 3 6 4 8 fmt.Println("stopAt=", stopAt)
20 fmt.Println("stopAt=", stopAt7)21 fmt.Println("accepted=", accepted[]int{1, 3, 5, 7})22}outputstopAt= 7 accepted= [1 3 5 7]
Follow the Loop Control
stopAtstarts at5.- The loop checks numbers from
1through8. continueskips even numbers.breakstops once the number is greater than5.- The accepted odd numbers are
[1 3 5]. | number | action | accepted | | --- | --- | --- | | 1 | keep |[1]| | 2 | skip even |[1]| | 3 | keep |[1 3]| | 4 | skip even |[1 3]| | 5 | keep |[1 3 5]| | 6 | stop |[1 3 5]|
Exercise: break_continue.go
Reproduce accepted= [1 3 5], then use the pinned stopAt variants to predict [1 3] and [1 3 5 7].