Đây là phần thứ 9 của series hướng dẫn này. Các bạn có thể xem hướng dẫn Phần 8: Câu lệnh if ... else  ở đây.

Chắc hẳn các bạn không còn xa lạ gì với vòng lặp, khi mà ở mỗi ngôn ngữ lập trình chúng ta đều phải nghiên cứu về vòng lặp, có thể là vòng lặp for, while, do ... while, ... Vậy ngôn ngữ Go cũng không là ngoại lệ, bài hướng dẫn này sẽ giúp chúng ta hiểu được cách sử dụng vòng lặp trong Go như thế nào.

Một câu lệnh vòng lặp được sử dụng để thực hiện một khối mã liên tục.

for là vòng lặp duy nhất có sẵn trong Go. Go không có vòng lặp while hay do ... while như ở các ngôn ngữ khác.

Cú pháp vòng lặp

for initialisation; condition; post {  
}

Câu lệnh khởi tạo initialisation sẽ chỉ được thực hiện một lần. Sau khi khởi tạo, điều kiện condition sẽ được kiểm tra, nếu điều kiện là true thì phần thân của vòng lặp trong dấu {} sẽ được thực thi. Post ở đây được hiểu như biến chạy, biến chạy sẽ được thực hiện sau mỗi lần lặp thành công của vòng lặp. Sau khi câu lệnh được thực hiện, điều kiện được kiểm tra lại, nếu điều kiện vẫn đúng, vòng lặp sẽ tiếp tục được thực hiện, nếu điều kiện sai, vòng lặp for sẽ kết thúc.

Ví dụ: Viết một chương trình sử dụng vòng lặp for in ra các số từ 1 đến 10.

package main

import (
	"fmt"
)

func main() {
	for i := 1; i <= 10; i++ {
		fmt.Printf(" %d",i)
	}
}

Run in playground

Kết quả:

 1 2 3 4 5 6 7 8 9 10

Trong chương trình trên, biến i được khởi tạo bằng 1. Điều kiện cần kiểm tra là i <= 10, nếu điều kiện đúng thì giá trị i được in, nếu sai thì vòng lặp dừng. Biến i được tăng 1 sau mỗi lần lặp, cho đến khi i > 10 thì vòng lặp kết thúc.

Các biến được khai báo trong vòng lặp for chỉ được sử dụng trong phạm vi vòng lặp mà không thể gọi đến từ bên ngoài.

break

Lệnh break được sử dụng để dừng vòng lặp đột ngột và chuyển đến câu lệnh ngay sau vòng lặp for trước khi vòng lặp kết thúc theo bình thường.

Ví dụ: Viết một chương trình sử dụng vòng lặp for và lệnh break in các số từ 1 đến 5

package main

import (  
    "fmt"
)

func main() {  
    for i := 1; i <= 10; i++ {
        if i > 5 {
            break //vòng lặp dừng nếu i > 5
        }
        fmt.Printf("%d ", i)
    }
    fmt.Printf("\n Câu lệnh ngay sau vòng lặp")
}

Run in playground 

Kết quả:

1 2 3 4 5 
Câu lệnh ngay sau vòng lặp

Trong chương trình trên, giá trị của i được kiểm tra suốt mỗi lần lặp. Nếu i > 5 thì lệnh break được thực thi và vòng lặp dừng lại, câu lệnh ngay sau vòng lặp được chạy.

Continue

Lệnh continue được sử dụng để bỏ qua lệnh lặp hiện tại của vòng lặp for. Tất cả đoạn mã trong vòng lặp for sau khi gặp lệnh continue thì sẽ không được thực hiện cho phép lặp hiện tại. Vòng lặp sẽ chuyển sang bước lặp tiếp theo.

Ví dụ: Viết một chương trình in ra các số lẻ từ 1 đến 10 sử dụng lệnh continue.

package main

import (  
    "fmt"
)

func main() {  
    for i := 1; i <= 10; i++ {
        if i%2 == 0 {
            continue
        }
        fmt.Printf("%d ", i)
    }
}

Run in playground

Kết quả:

1 3 5 7 9

Trong chương trình trên if i%2 == 0 là kiểm tra phần dư của i chia 2 có bằng 0 hay không. Nếu bằng 0 thì lệnh continue được thực thi và điều khiển chuyển sang lần lặp tiếp theo của vòng lặp. Do đó, lệnh sau continue sẽ không được gọi và vòng lặp tiếp tục đến lần lặp tiếp theo. Nếu kiểm tra i%2 khác 0 thì lệnh in giá trị của i được thực thi.

Biến thể của vòng lặp

Ví dụ: 

package main

import (  
    "fmt"
)

func main() {  
    i := 0
    for ;i <= 10; { // biến khởi tạo và biến chạy có thể để trống
        fmt.Printf("%d ", i)
        i += 2
    }
}

Run in playground

Kết qủa:

0 2 4 6 8 10

Như chúng ta đã biết, 3 thành phần của vòng lặp for là biến khởi tạo, điều kiện và biến chạy. Trong chương trình trên, biến khởi tạo và biến chạy được bỏ qua, i được khởi tạo ngoài vòng lặp for. Vòng lặp sẽ được thực hiện với i <= 10, i được tăng với bước nhảy là 2 bên trong vòng lặp for. 

Ngoài ra, các dấy chấm phẩy của vòng lặp for trong chương trình trên cũng có thể được bỏ qua. ĐỊnh dạng này có thể được coi là một thay thế cho vòng lặp while, khi bỏ dấu chấm phẩy, chương trình được viết lại như sau và kết quả không thay đổi.

package main

import (  
    "fmt"
)

func main() {  
    i := 0
    for i <= 10 {
        fmt.Printf("%d ", i)
        i += 2
    }
}

Run in playground

Ngoài ra, chúng ta có thể khai báo và hoạt động nhiều biến trong vòng lặp for.

Ví dụ dưới đây chúng ta có thể sử dụng nhiều khai báo biến trong cùng một vòng lặp.

package main

import (
	"fmt"
)

func main() {
	for no, i := 10, 1; i <= 10 && no <= 19; i, no = i+1, no+1 {
		fmt.Printf("%d * %d = %d\n", no, i, no*i)
	}

}

Run in playground

Kết quả:

10 * 1 = 10
11 * 2 = 22
12 * 3 = 36
13 * 4 = 52
14 * 5 = 70
15 * 6 = 90
16 * 7 = 112
17 * 8 = 136
18 * 9 = 162
19 * 10 = 190

Trong chương trình trên, noi được khai báo và khởi tạo lần lượt là 10 và 1. Biến chạy với bước nhảy là 1 vào cuối mỗi lần lặp. Toán tử boolean && được sử dụng trong kiểm tra điều kiện để đảm bảo rằng điều kiện đúng khi cả 2 biểu thức i <=10 và no <=19 đều đúng.

Vòng lặp vô hạn

Cú pháp tạo một vòng lặp vô hạn là:

for {
}

Ví dụ sau đây sẽ in "Hello World" liên tục không ngừng.

package main

import "fmt"

func main() {  
    for {
        fmt.Println("Hello World")
    }
}

Nếu bạn cố gắng chạy chương trình trên trong playground, bạn sẽ nhận được một số hữu hạn "Hello World" và thông báo lỗi "process took too long" (quá trình mất quá nhiều thời gian). Hãy thử chạy chương trình này trên IDE dưới máy tính của bạn, bạn sẽ thấy nó in "Hello World" vô hạn.

Bạn cũng có thể sử dụng vòng lặp for trong thao tác với mảng. Chúng ta sẽ tìm hiểu điều đó ở một hướng dẫn khác.

Chúng ta vừa tìm hiểu xong vòng lặp for. Hy vọng bạn sẽ thích bài hướng dẫn này. Vui lòng để lại ý kiến và phản hồi ở phía dưới nhé!

Mời các bạn xem bài hướng dẫn tiếp theo: Phần 10 - Switch

Nguồn: https://golangbot.com/learn-golang-series/