Đ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
if expression {
}Hoặc
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
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.
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ụ
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
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
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.
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
switch expr {
case case1:
statement1
case case2:
statement2
default:
default statement
}Một ví dụ đơn giản như sau
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
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入口.
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ề.
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
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
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 đề.
