Skip to content

Điều khiển điều kiện trong Go

Trong Go, câu lệnh điều khiển điều kiện tổng cộng có ba loại if, switch, select. select tương đối đặc biệt so với hai cái trước, phần này sẽ không giải thích, sẽ để dành giới thiệu trong phần đồng thời.

if else

if else có tối đa hai nhánh phán đoán, định dạng câu lệnh như sau

go
if expression {

}

Hoặc

go
if expression {

}else {

}

expression phải là một biểu thức boolean, tức là kết quả要么 đúng要么 sai, phải là một giá trị boolean, ví dụ như sau

go
func main() {
   a, b := 1, 2
   if a > b {
      b++
   } else {
      a++
   }
}

Cũng có thể viết biểu thức phức tạp hơn, khi cần thiết để nâng cao khả năng đọc, nên sử dụng ngoặc đơn để biểu thị rõ cái nào nên được tính toán trước.

go
func main() {
   a, b := 1, 2
    if a<<1%100+3 > b*100/20+6 { // (a<<1%100)+3 > (b*100/20)+6
      b++
   } else {
      a++
   }
}

Đồng thời câu lệnh if cũng có thể chứa một số câu lệnh đơn giản, ví dụ

go
func main() {
  if x := 1 + 1; x > 2 {
    fmt.Println(x)
  }
}

else if

Câu lệnh else if có thể tạo thêm nhiều nhánh phán đoán dựa trên if else, định dạng câu lệnh như sau

go
if expression1 {

}else if expression2 {

}else if expression3 {

}else {

}

Trong quá trình thực thi, phán đoán của mỗi biểu thức là từ trái sang phải, toàn bộ phán đoán của câu lệnh if là từ trên xuống dưới. Một ví dụ chấm điểm theo thành tích như sau, cách viết thứ nhất

go
func main() {
   score := 90
   var ans string
   if score == 100 {
      ans = "S"
   } else if score >= 90 && score < 100 {
      ans = "A"
   } else if score >= 80 && score < 90 {
      ans = "B"
   } else if score >= 70 && score < 80 {
      ans = "C"
   } else if score >= 60 && score < 70 {
      ans = "E"
   } else if score >= 0 && score < 60 {
      ans = "F"
   } else {
      ans = "nil"
   }
   fmt.Println(ans)
}

Cách viết thứ hai lợi dụng tiền đề là câu lệnh if phán đoán từ trên xuống dưới, vì vậy mã sẽ ngắn gọn hơn.

go
func main() {
  score := 90
  var ans string
  if score >= 0 && score < 60 {
    ans = "F"
  } else if score < 70 {
    ans = "D"
  } else if score < 80 {
    ans = "C"
  } else if score < 90 {
    ans = "B"
  } else if score < 100 {
    ans = "A"
  } else if score == 100 {
    ans = "S"
    }else {
        ans = "nil"
    }
  fmt.Println(ans)
}

switch

Câu lệnh switch cũng là một loại câu lệnh phán đoán nhiều nhánh, định dạng câu lệnh như sau

go
switch expr {
  case case1:
    statement1
  case case2:
    statement2
  default:
    default statement
}

Một ví dụ đơn giản như sau

go
func main() {
   str := "a"
   switch str {
   case "a":
      str += "a"
      str += "c"
   case "b":
      str += "bb"
      str += "aaaa"
   default: // Khi tất cả case không khớp sẽ thực thi nhánh default
      str += "CCCC"
   }
   fmt.Println(str)
}

Cũng có thể viết một số câu lệnh đơn giản trước biểu thức, ví dụ như khai báo biến mới

go
func main() {
  switch num := f(); { // Tương đương switch num := f(); true {
  case num >= 0 && num <= 1:
    num++
  case num > 1:
    num--
    fallthrough
  case num < 0:
    num += num
  }
}

func f() int {
  return 1
}

Câu lệnh switch cũng có thể không có biểu thức入口.

go
func main() {
   num := 2
   switch { // Tương đương switch true {
   case num >= 0 && num <= 1:
      num++
   case num > 1:
      num--
   case num < 0:
      num *= num
   }
   fmt.Println(num)
}

Thông qua từ khóa fallthrough để tiếp tục thực thi nhánh tiếp theo liền kề.

go
func main() {
   num := 2
   switch {
   case num >= 0 && num <= 1:
      num++
   case num > 1:
      num--
      fallthrough // Sau khi thực thi xong nhánh này, sẽ tiếp tục thực thi nhánh tiếp theo
   case num < 0:
      num += num
   }
   fmt.Println(num)
}

label

Câu lệnh nhãn, gán nhãn cho một khối mã, có thể là mục tiêu của goto, break, continue. Ví dụ như sau

go
func main() {
  A:
    a := 1
  B:
    b := 2
}

Việc sử dụng nhãn đơn thuần không có ý nghĩa gì, cần kết hợp với các từ khóa khác để sử dụng.

goto

goto sẽ chuyển quyền kiểm soát cho câu lệnh có nhãn tương ứng trong cùng một hàm, ví dụ như sau

go
func main() {
   a := 1
   if a == 1 {
      goto A
   } else {
      fmt.Println("b")
   }
A:
   fmt.Println("a")
}

Trong ứng dụng thực tế, goto được sử dụng rất ít, nhảy tới nhảy lui làm giảm khả năng đọc mã, tiêu hao hiệu năng cũng là một vấn đề.

Golang by www.golangdev.cn edit