1 Tổng quan về Câu lệnh Vòng lặp

Trong ngôn ngữ Go, câu lệnh vòng lặp cho phép chúng ta thực hiện một khối mã nhiều lần. Khi bạn cần thực hiện lặp đi lặp lại một số thao tác cụ thể, câu lệnh vòng lặp trở nên rất hữu ích. Ví dụ, bạn có thể muốn lặp qua từng phần tử trong một mảng, hoặc lặp lại một thao tác cho đến khi một điều kiện cụ thể được đáp ứng. Trong ngôn ngữ Go, câu lệnh vòng lặp chủ yếu được thực hiện bằng cách sử dụng từ khóa for, đó là duy nhất câu lệnh vòng lặp trong ngôn ngữ Go. Việc sử dụng đúng câu lệnh vòng lặp là rất quan trọng để viết mã hiệu quả và dễ bảo trì.

2 Cơ bản về Vòng lặp for

2.1 Cấu trúc của Vòng lặp for

Vòng lặp for trong ngôn ngữ Go bao gồm ba phần:

  1. Câu lệnh khởi tạo: được thực hiện trước vòng lặp đầu tiên, thường được sử dụng để khai báo một biến đếm vòng lặp.
  2. Biểu thức điều kiện: được đánh giá trước mỗi vòng lặp. Nếu điều kiện là true, khối mã của vòng lặp được thực hiện.
  3. Câu lệnh sau vòng lặp: được thực hiện sau khi khối mã của mỗi vòng lặp, thường được sử dụng để cập nhật biến đếm vòng lặp.

Cú pháp của vòng lặp for như sau:

for câu lệnh khởi tạo; biểu thức điều kiện; câu lệnh sau vòng lặp {
    // mã thân vòng lặp
}

2.2 Ví dụ đơn giản của Vòng lặp for

Hãy hiểu quá trình thực thi của vòng lặp for thông qua một ví dụ đơn giản:

package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println("Giá trị của i là:", i)
    }
}

Trong ví dụ này, biến i được khởi tạo là 0. Vòng lặp for kiểm tra xem điều kiện i < 5 có đúng hay không. Nếu điều kiện là đúng, thân vòng lặp được thực hiện và giá trị của i được in ra. Sau khi thực hiện thân vòng lặp, giá trị của i được cập nhật bằng i++ (phép tăng giá trị), sau đó vòng lặp kiểm tra lại điều kiện cho đến khi giá trị của i đạt đến 5, lúc này điều kiện trở thành sai và vòng lặp for kết thúc.

2.3 Các ví dụ khác về Vòng lặp for

Vòng lặp for trong ngôn ngữ Go rất linh hoạt và có thể được viết dưới nhiều dạng khác nhau để xử lý các tình huống khác nhau.

2.3.1 Vòng lặp Vô hạn

Trong Go, bạn có thể bỏ qua câu lệnh khởi tạo, biểu thức điều kiện, và câu lệnh sau vòng lặp của vòng lặp for, tạo ra một vòng lặp vô hạn sẽ chạy cho đến khi kết thúc bằng một câu lệnh break hoặc một giá trị trả về từ một hàm.

for {
    // Mã trong vòng lặp vô hạn
    if điềuKiệnNàoĐó {
        break // Thoát khỏi vòng lặp khi một điều kiện cụ thể được đáp ứng
    }
}

2.3.2 Vòng lặp chỉ chứa Điều kiện

Trong Go, bạn cũng có thể sử dụng một vòng lặp for chỉ chứa một điều kiện, tương tự như một vòng lặp while trong các ngôn ngữ lập trình khác.

n := 0
for n < 5 {
    fmt.Println(n)
    n++
}

Mã trên sẽ in ra 0 đến 4, và vòng lặp sẽ kết thúc khi n đạt đến 5.

2.3.3 Vòng lặp qua mảng hoặc slice

Trong Go, từ khóa range được sử dụng để tối giản hóa việc lặp qua từng phần tử của một mảng hoặc slice.

items := []int{1, 2, 3, 4, 5}
for index, value := range items {
    fmt.Printf("Index: %d, Giá trị: %d\n", index, value)
}

Mã trên sẽ in ra chỉ số và giá trị của mỗi phần tử. Nếu bạn chỉ cần giá trị của các phần tử, bạn có thể sử dụng _ để bỏ qua chỉ số.

for _, value := range items {
    fmt.Printf("Giá trị: %d\n", value)
}

Chú ý: Việc sử dụng mảng sẽ được giải thích chi tiết trong các chương sau. Nếu bạn không hiểu phần này, không sao miễn là bạn hiểu được rằng for loop có thể được sử dụng theo cách này.

2.3.4 Lặp qua các bản đồ

Khi lặp lại qua một bản đồ, sự kết hợp của vòng lặp for và biểu thức range rất mạnh mẽ. Điều này cho phép bạn lấy mỗi cặp key-value của bản đồ.

màu_sắc := map[string]string{"đỏ": "#ff000", "xanh lá cây": "#00ff00", "xanh dương": "#000ff"}
for key, value := range màu_sắc {
    fmt.Printf("Key: %s, Value: %s\n", key, value)
}

Trong ví dụ này, chúng ta in tất cả các key và giá trị tương ứng của chúng trong bản đồ màu_sắc. Tương tự khi lặp qua slice, nếu bạn chỉ cần key hoặc value, bạn có thể lựa chọn bỏ qua phần còn lại.

Lưu ý: Việc sử dụng bản đồ sẽ được giải thích chi tiết trong các chương tiếp theo. Nếu bạn không hiểu phần này, không sao miễn là bạn hiểu rằng for loop có thể được sử dụng theo cách này.

3 Kiểm soát luồng của vòng lặp

3.1 Sử dụng break để kết thúc một vòng lặp

Đôi khi chúng ta cần thoát khỏi vòng lặp sớm khi một điều kiện cụ thể được đáp ứng, và trong những trường hợp như vậy, câu lệnh break có thể được sử dụng. Dưới đây là một ví dụ về việc sử dụng break để thoát khỏi một vòng lặp:

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i == 5 {
            break // Thoát khỏi vòng lặp khi i bằng 5
        }
        fmt.Println("Giá trị của i là:", i)
    }
    // Kết quả sẽ chỉ chứa các giá trị từ 0 đến 4
}

3.2 Sử dụng continue để bỏ qua các lần lặp

Trong một số tình huống, chúng ta có thể muốn bỏ qua lần lặp hiện tại và tiếp tục với lần lặp tiếp theo trong vòng lặp. Điều này có thể được thực hiện bằng cách sử dụng câu lệnh continue. Dưới đây là một ví dụ:

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i%2 != 0 {
            continue // Bỏ qua lần lặp này nếu i là số lẻ
        }
        fmt.Println("Số chẵn:", i)
    }
}