Điều khiển vòng lặp trong Go
Trong Go, chỉ có một loại câu lệnh vòng lặp: for, Go đã loại bỏ câu lệnh while, câu lệnh for có thể được sử dụng như while.
for
Định dạng câu lệnh như sau
for init statement; expression; post statement {
execute statement
}Khi chỉ giữ lại điều kiện vòng lặp, sẽ trở thành while.
for expression {
execute statement
}Đây là một vòng lặp chết, không bao giờ thoát ra
for {
execute statement
}Ví dụ
Đây là đoạn mã xuất các số trong khoảng [0,20]
for i := 0; i <= 20; i++ {
fmt.Println(i)
}Bạn có thể khởi tạo nhiều biến cùng lúc, sau đó tăng dần chúng
for i, j := 1, 2; i < 100 && j < 1000; i, j = i+1, j+1 {
fmt.Println(i, j)
}Sử dụng như while
num := 1
for num < 100 {
num *= 2
}Vòng lặp kép in bảng cửu chương, đây là một ví dụ vòng lặp kinh điển
func main() {
for i := 1; i <= 9; i++ {
for j := 1; j <= 9; j++ {
if i <= j {
fmt.Printf("%d*%d = %2d ", i, j, i*j)
}
}
fmt.Println()
}
}Xuất ra như sau
1*1 = 1 1*2 = 2 1*3 = 3 1*4 = 4 1*5 = 5 1*6 = 6 1*7 = 7 1*8 = 8 1*9 = 9
2*2 = 4 2*3 = 6 2*4 = 8 2*5 = 10 2*6 = 12 2*7 = 14 2*8 = 16 2*9 = 18
3*3 = 9 3*4 = 12 3*5 = 15 3*6 = 18 3*7 = 21 3*8 = 24 3*9 = 27
4*4 = 16 4*5 = 20 4*6 = 24 4*7 = 28 4*8 = 32 4*9 = 36
5*5 = 25 5*6 = 30 5*7 = 35 5*8 = 40 5*9 = 45
6*6 = 36 6*7 = 42 6*8 = 48 6*9 = 54
7*7 = 49 7*8 = 56 7*9 = 63
8*8 = 64 8*9 = 72
9*9 = 81for range
for range có thể thuận tiện hơn để duyệt một số cấu trúc dữ liệu có thể lặp, như mảng, slice, chuỗi, map, kênh. Định dạng câu lệnh như sau:
for index, value := range iterable {
// body
}index là chỉ số của cấu trúc dữ liệu có thể lặp, value là giá trị tương ứng với chỉ số đó, ví dụ sử dụng for range để duyệt một chuỗi.
func main() {
sequence := "hello world"
for index, value := range sequence {
fmt.Println(index, value)
}
}for range cũng có thể lặp một giá trị số nguyên, giá trị chữ, hằng số, biến đều có hiệu lực.
for i := range 10 {
fmt.Println(i)
}
n := 10
for i := range n {
fmt.Println(i)
}
const n = 10
for i := range n {
fmt.Println(i)
}Đối với mỗi loại cấu trúc dữ liệu, cách thực hiện của for range đều có sự khác nhau, sau này cũng sẽ nói đến, bạn có thể đến Go - for statement để tìm hiểu thêm chi tiết.
break
Từ khóa break sẽ chấm dứt vòng lặp for ở lớp trong cùng, kết hợp với nhãn có thể đạt hiệu quả chấm dứt vòng lặp ở lớp ngoài, ví dụ như sau: Đây là một vòng lặp kép
func main() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i <= j {
break
}
fmt.Println(i, j)
}
}
}Xuất ra
1 0
2 0
2 1
3 0
3 1
3 2
...
9 6
9 7
9 8Sử dụng nhãn để gián đoạn vòng lặp ở lớp ngoài
func main() {
Outer:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i <= j {
break Outer
}
fmt.Println(i, j)
}
}
}Xuất ra
continue
Từ khóa continue sẽ bỏ qua lần lặp hiện tại của vòng lặp ở lớp trong cùng, trực tiếp vào lần lặp tiếp theo, kết hợp với nhãn có thể đạt hiệu quả bỏ qua vòng lặp ở lớp ngoài, ví dụ như sau
func main() {
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i > j {
continue
}
fmt.Println(i, j)
}
}
}Xuất ra
0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
...
7 7
7 8
7 9
8 8
8 9
9 9Sử dụng nhãn
func main() {
Out:
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if i > j {
continue Out
}
fmt.Println(i, j)
}
}
}Xuất ra
0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9