Skip to content

Đ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

go
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.

go
for expression {
  execute statement
}

Đây là một vòng lặp chết, không bao giờ thoát ra

go
for {
  execute statement
}

Ví dụ

Đây là đoạn mã xuất các số trong khoảng [0,20]

go
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

go
for i, j := 1, 2; i < 100 && j < 1000; i, j = i+1, j+1 {
  fmt.Println(i, j)
}

Sử dụng như while

go
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

go
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

go
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 = 81

for 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:

go
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.

go
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.

go
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

go
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 8

Sử dụng nhãn để gián đoạn vòng lặp ở lớp ngoài

go
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

go
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 9

Sử dụng nhãn

go
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

Golang by www.golangdev.cn edit