+2

Golang cơ bản: Các cấu trúc điều khiển (2/3)

Ở bài viết trước mình đã nói về các kiểu dữ liệu, toán tử logic, bitwise,... trong đó mình giới thiệu các kiểu hay được sử dụng trong Go, cũng như một số thông tin cơ bản và một chút "deep dive". Ở bài này chúng ta sẽ tìm hiểu về các câu lệnh như if, else, for,...

Nếu các bạn chưa đọc phần 1: Golang cơ bản: Kiểu dữ liệu và Toán tử (1/3)

Câu lệnh If Else

Trong Golang, câu lệnh if cho phép bạn thực thi một khối code (block of code) chỉ khi điều kiện nhất định là đúng. Dưới đây là cú pháp cơ bản cho câu lệnh if trong Golang:

if isRain {
  // mang theo ô che mưa
}

Điều kiện ở đây là một biểu thức mà kết quả trả về là một giá trị boolean (true/ false), như chúng ta đã học ở Phần 1. Đặc biệt trong Go, biểu thức điều kiện không cần nằm trong dấu ngoặc tròn (...), đồng thời chúng cũng bắt buộc phải có ngoặc nhọn {...}.

Bạn cũng có thể sử dụng câu lệnh if kết hợp với mệnh đề else để chỉ định một khối code sẽ được thực thi nếu điều kiện là sai. Dưới đây là cú pháp cho câu lệnh if kèm theo mệnh đề else/ else if:

x := 10
if x > 5 {
  fmt.Println("x lớn hơn 5")
} else if x < 5 {
  fmt.Println("x nhỏ hơn 5")
} else {
  fmt.Println("x bằng 5")
}

Trong ví dụ này, câu lệnh if sẽ in ra thông báo "x lớn hơn 5" trên màn hình console vì điều kiện x (10) > 5 là đúng.

Bạn hoàn toàn có thể vừa khai báo, vừa kiểm tra kết quả, đây là cách viết ngắn trong một dòng code duy nhất:

if result := computeResult(); result > 5 {
  fmt.Println("Kết quả lớn hơn 5")
} else if result < 5 {
  fmt.Println("Kết quả nhỏ hơn 5")
} else {
  fmt.Println("Kết quả bằng 5")
}

Câu lệnh ngắn gọn result := computeResult() khai báo một biến mới là result và gán cho nó giá trị trả về từ hàm computeResult().

Sau đó, giá trị của result được so sánh với 5 bằng câu lệnh if. Nếu result lớn hơn 5, thông báo "Kết quả lớn hơn 5" sẽ được in ra màn hình console.

Lưu ý rằng, biến result chỉ có thể truy cập được trong phạm vi của câu lệnh if trong đó nó được khai báo. Điều này bởi result là một biến cục bộ chỉ có thể sử dụng trong khối mã mà nó được định nghĩa.

Vòng lặp For

Vòng lặp for là một cấu trúc điều khiển cho phép bạn lặp lại một khối code nhiều lần. Trong Go, có ba hình thức của vòng lặp for: hình thức cơ bản, hình thức chỉ có điều kiện và hình thức vô hạn và mình sẽ đi qua cả 3 hình thức này ở bên dưới.

Hình thức cơ bản của vòng lặp for bao gồm một câu lệnh khởi tạo, một điều kiện và một câu lệnh thực thi sau (post-processing):

for i := 0; i < 10; i++ {
  fmt.Println(i)
}

Đoạn code trên này sẽ in ra các số từ 0 đến 9 lên màn hình console.

Hình thức chỉ có điều kiện của vòng lặp for chỉ bao gồm một điều kiện (đúng như tên gọi). Nó giống với hình thức cơ bản, nhưng không bao gồm câu lệnh khởi tạo hoặc câu lệnh xử lý sau:

x := 5
for x < 10 {
  fmt.Println(x)
  x++
}

// 5
// 6
// 7
// 8
// 9

Mã này sẽ in ra các số từ 5 đến 9 lên màn hình console.

Hình thức vô hạn của vòng lặp for không bao gồm điều kiện. Nó sẽ thực thi khối mã liên tục cho đến khi bị ngắt bởi câu lệnh break hoặc câu lệnh return.

for {
  fmt.Println("Hello World!")
}

"Mình có thể dùng hình thức cơ bản để mô phỏng hai hình thức khác không nhỉ?"

Bạn có thể để trống bất kỳ phần nào của hình thức cơ bản. Nếu bạn muốn mô phỏng hình thức chỉ có điều kiện từ hình thức cơ bản, đây là một ví dụ:

for i := 5; i < 10; { // <-- bỏ trống phần post loop
  fmt.Println(i)
}

Vòng lặp For với Range

Vòng lặp for kèm theo từ khoá range là một công cụ được sử dụng khá nhiều trong Go, nó cho phép bạn dễ dàng lặp qua các phần tử của mảng, chuỗi, slice, map mà không cần viết for cơ bản và index một cách rõ ràng:

arr := [5]int{1, 2, 3, 4, 5}

for i, v := range arr {
  fmt.Println(i, v)
}

// 0 1
// 1 2
// 2 3
// 3 4
// 4 5

Từ khoá range duyệt qua các phần tử của mảng arr, và các biến lặp i và v lần lượt được gán chỉ số và giá trị của từng phần tử.

Câu lệnh Switch Case

Câu lệnh switch case tương tự như một loạt các câu lệnh if được nối lại với nhau. Nó cho phép bạn kiểm tra một giá trị duy nhất với nhiều trường hợp khả thi và thực thi một khối mã dựa vào trường hợp (case) phù hợp nhất:

x := 3

switch x {
case 1:
  fmt.Println("x bằng 1")
case 2:
  fmt.Println("x bằng 2")
case 3:
  fmt.Println("x bằng 3")
default:
  fmt.Println("x không bằng 1, 2 hoặc 3")
}

// x bằng 3

Câu lệnh switch sẽ xem xét giá trị của biến x và kiểm tra nó với từng trường hợp một cách tuần tự từ trên xuống.

Từ khoá "fallthrough"

Từ khoá "fallthrough" được sử dụng để cho phép mã trong câu lệnh switch "rơi vào" trường hợp sau, mà không thoát khỏi câu lệnh switch.

package main

import "fmt"

func main() {
    i := 45
    switch {
    case i < 10:
        fmt.Println("i nhỏ hơn 10")
    case i < 50:
        fmt.Println("i nhỏ hơn 50")
        fallthrough // <---------------
    case i < 100:
        fmt.Println("i nhỏ hơn 100")
    }
}

// i nhỏ hơn 50
// i nhỏ hơn 100

Sau khi phù hợp với trường hợp thứ hai i < 50, luồng sẽ không bị gián đoạn do từ khoá "fallthrough", và tiếp tục vào trường hợp tiếp theo.

Nguồn tham khảo

Bài viết được dịch từ Go Fundamentals: Control Structures (P2)


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí