Chuyển đến nội dung chính
Mô-đun 1 · Bài học 4 trong tổng số 54/50 trong khóa học~8 min
Bài học theo mô-đun (4/5)

Toán tử

Go có các toán tử cổ điển mà bạn mong đợi, kèm theo một số điều bất ngờ: số học, so sánh, logic, bitwise. Không có toán tử ternary (a ? b : c), không quá tải, không chuyển đổi ngầm định giữa các loại. Đơn giản là một tính năng.

số học

Go
a, b := 10, 3
fmt.Println(a + b)  // 13
fmt.Println(a - b)  // 7
fmt.Println(a * b)  // 30
fmt.Println(a / b)  // 3   ← divisione INTERA tra interi
fmt.Println(a % b)  // 1   ← resto (modulo)

Tăng và giảm là TUYÊN BỐ, không phải biểu thức

x++ và x-- không tạo ra giá trị: chúng là "hành động" và không có gì nhiều hơn nữa. Không y := x++ như trong C.

Go
x := 5
x++          // ok: incrementa x
// y := x++  // ERRORE di compilazione
fmt.Println(x) // 6

So sánh

== != < <= > >= trả lại bool. Chúng áp dụng cho số và chuỗi; cho cấu trúc TẤT CẢ các trường phải có thể so sánh được (không có lát/bản đồ bên trong).

Go
"abc" == "abc"  // true
"abc" < "abd"   // true (ordine lessicografico)
3 != 4           // true

Logic với ngắn mạch

&&, ||, !. Chúng đoản mạch từ trái sang phải: nếu lần đầu tiên toán hạng đủ để xác định kết quả, toán hạng thứ hai thậm chí còn không được đánh giá.

Go
adult := age >= 18
seniorAdult := age >= 18 && age < 65

Theo chiều bit

& VÀ, | HOẶC, ^ XOR, << dịch trái, >> dịch chuyển phải, &^ VÀ KHÔNG (rõ ràng một chút). Chúng rất hữu ích cho cờ, phân tích nhị phân và tối ưu hóa:

Go
flags := uint8(0b0000_0011)
flags |= 0b0000_0100   // imposta un bit:    0000_0111
flags &^= 0b0000_0010  // cancella un bit:   0000_0101
hasFlag := flags & 0b0000_0100 != 0  // true

Không có chuyển đổi tiềm ẩn

1 + 1.5 trong Go biên dịch, vì cả hai đều là những chữ chưa được gõ. Nhưng var i int = 1; i + 1.5 thực hiện KHÔNG: bạn cần float64(i) + 1.5.

Go
i := 1
f := 1.5
// i + f          // ERRORE
float64(i) + f    // 2.5

Đến lượt bạn

tập thể dục#go.m1.l4.e1
Nỗ lực: 0Đang tải…

Tính phần còn lại của phép chia 17 cho 5 và in ra. Dự kiến: 2.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Toán tử modulo là `%`.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#go.m1.l4.e2
Nỗ lực: 0Đang tải…

In đúng nếu độ tuổi từ 18 đến 65, nếu không thì in sai.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Kết hợp hai so sánh với `&&`.

Giải pháp khả dụng sau 3 lần thử

Quiz#go.m1.l4.e3
Sẵn sàng

Mã này in gì?

Go
a, b := 7, 2
fmt.Println(a/b, a%b)
Tùy chọn trả lời

Tóm tắt lại

  • Số học cổ điển; / giữa các số nguyên là phép chia số nguyên (cắt ngắn).
  • ++ và -- là câu lệnh, không phải biểu thức: không y := x++.
  • Các toán tử so sánh và logic tạo ra bool; &&/|| đoản mạch.
  • Bitwise & | ^ << >> &^ cho cờ và phân tích cú pháp nhị phân.
  • Không có chuyển đổi ngầm giữa các loại khác nhau: sử dụng type(x).