Toán tử là nền tảng của mọi ngôn ngữ lập trình. Do đó, chức năng của ngôn ngữ Golang không đầy đủ nếu không sử dụng toán tử. Toán tử cho phép chúng ta thực hiện các loại hoạt động khác nhau trên toán hạng. Trong ngôn ngữ Go, toán tử có thể được phân loại dựa trên chức năng khác nhau của chúng.
Toán tử số học
Các toán tử này được sử dụng để thực hiện phép toán trên các toán hạng trong ngôn ngữ Go:
- Phép cộng: ‘+’ cộng hai toán hạng. Ví dụ: x+y.
- Phép trừ: ‘-‘ trừ hai toán hạng. Ví dụ: x-y.
- Phép nhân: ‘*’ nhân hai toán hạng. Ví dụ: x*y.
- Phép chia: ‘/’ chia toán hạng thứ nhất cho toán hạng thứ hai. Ví dụ: x/y.
- Phép chia dư: Toán tử ‘%’ trả về phần dư khi chia toán hạng thứ nhất cho toán hạng thứ hai. Ví dụ: x%y.
Lưu ý: -, +, !, &, *, <- và ^ còn được gọi là toán tử một ngôi và thứ tự ưu tiên của toán tử một ngôi cao hơn. Các toán tử ++ và — đến từ các câu lệnh, chúng không phải là biểu thức, do đó chúng nằm ngoài hệ thống phân cấp toán tử.
Ví dụ:
//Minh họa chương trình Go dùng toán tử số học
package main
import "fmt"
func main() {
p:= 34
q:= 20
// Phép cộng
result1:= p + q
fmt.Printf("Result of p + q = %d", result1)
// Phép trừ
result2:= p - q
fmt.Printf("\nResult of p - q = %d", result2)
// Phép nhân
result3:= p * q
fmt.Printf("\nResult of p * q = %d", result3)
// Division
result4:= p / q
fmt.Printf("\nResult of p / q = %d", result4)
// Modulus
result5:= p % q
fmt.Printf("\nResult of p %% q = %d", result5)
}
Kết quả:
Kết quả của p + q = 54
Kết quả của p - q = 14
Kết quả của p * q = 680
Kết quả của p / q = 1
Kết quả của p % q = 14
Toán tử quan hệ
Toán tử quan hệ được sử dụng để so sánh hai giá trị. Chúng ta hãy xem từng toán tử một:
- Toán tử ‘=='(Bằng) kiểm tra xem hai toán hạng đã cho có bằng nhau hay không. Nếu bằng nhau, nó trả về true. Nếu không, nó trả về false. Ví dụ, 5==5 sẽ trả về true.
- Toán tử ‘!='(Không bằng) kiểm tra xem hai toán hạng đã cho có bằng nhau hay không. Nếu không, nó trả về true. Ngược lại, nó trả về false. Đây là phần bù boolean chính xác của toán tử ‘==’. Ví dụ, 5!=5 sẽ trả về false.
- Toán tử ‘>'(Lớn hơn) kiểm tra xem toán hạng đầu tiên có lớn hơn toán hạng thứ hai hay không. Nếu lớn hơn, nó trả về true. Nếu nhỏ hơn, nó trả về false. Ví dụ, 6>5 sẽ trả về true.
- Toán tử ‘<‘(Nhỏ hơn) kiểm tra xem toán hạng đầu tiên có nhỏ hơn toán hạng thứ hai hay không. Nếu nhỏ hơn, nó trả về true. Nếu không, nó trả về false. Ví dụ, 6<5 sẽ trả về false.
- ‘>='(Lớn hơn bằng)toán tử kiểm tra xem toán hạng đầu tiên có lớn hơn hoặc bằng toán hạng thứ hai không. Nếu lớn hơn hoặc bằng, nó trả về true. Nếu nhỏ hơn hoặc bằng, nó trả về false. Ví dụ: 5>=5 sẽ trả về true.
- ‘<='(Nhỏ hơn bằng)toán tử kiểm tra xem toán hạng đầu tiên có nhỏ hơn hoặc bằng toán hạng thứ hai không. Nếu lớn hơn hoặc bằng, nó trả về true. Nếu nhỏ hơn hoặc bằng, nó trả về false. Ví dụ: 5<=5 cũng sẽ trả về true.
Ví dụ:
// Minh họa chương trình Go dùng toán tử quan hệ
package main
import "fmt"
func main() {
p:= 34
q:= 20
// ‘=='(Equal To)
result1:= p == q
fmt.Println(result1)
// ‘!='(Not Equal To)
result2:= p != q
fmt.Println(result2)
// ‘<‘(Less Than)
result3:= p < q
fmt.Println(result3)
// ‘>'(Greater Than)
result4:= p > q
fmt.Println(result4)
// ‘>='(Greater Than Equal To)
result5:= p >= q
fmt.Println(result5)
// ‘<='(Less Than Equal To)
result6:= p <= q
fmt.Println(result6)
}
Kết quả:
false
true
false
true
true
false
Toán tử logic
Chúng được sử dụng để kết hợp hai hoặc nhiều điều kiện/ràng buộc hoặc để bổ sung cho việc đánh giá điều kiện ban đầu đang xem xét.
- AND: Toán tử ‘&&’ trả về true khi cả hai điều kiện đang xem xét đều được thỏa mãn. Nếu không, nó trả về false. Ví dụ: a && b trả về true khi cả a và b đều đúng (tức là khác không).
- OR: Toán tử ‘||’ trả về true khi một (hoặc cả hai) điều kiện đang xem xét được thỏa mãn. Nếu không, nó trả về false. Ví dụ: a || b trả về true nếu một trong a hoặc b là đúng (tức là khác không). Tất nhiên, nó trả về true khi cả a và b đều đúng.
- Logic NOT: Toán tử ‘!’ trả về true khi điều kiện đang xem xét không được thỏa mãn. Nếu không, nó trả về false. Ví dụ: !a trả về true nếu a là sai, tức là khi a = 0.
Ví dụ:
// Minh họa chương trình Go dùng toán tử logic
package main
import "fmt"
func main() {
var p int = 23
var q int = 60
if(p!=q && p<=q){
fmt.Println("True")
}
if(p!=q || p<=q){
fmt.Println("True")
}
if(!(p==q)){
fmt.Println("True")
}
}
Kết quả:
True
True
True
Toán tử bitwise
Trong ngôn ngữ Go, có 6 toán tử bitwise hoạt động ở cấp độ bit hoặc được sử dụng để thực hiện các phép toán bit-by-bit. Sau đây là các toán tử bitwise:
- & (bitwise AND): Lấy hai số làm toán hạng và thực hiện AND trên mọi bit của hai số. Kết quả của AND chỉ là 1 nếu cả hai bit đều là 1.
- | (bitwise OR): Lấy hai số làm toán hạng và thực hiện OR trên mọi bit của hai số. Kết quả của OR là 1 nếu bất kỳ bit nào trong hai bit đều là 1.
- ^ (bitwise XOR): Lấy hai số làm toán hạng và thực hiện XOR trên mọi bit của hai số. Kết quả của XOR là 1 nếu hai bit khác nhau.
- << (shift trái): Lấy hai số, dịch chuyển trái các bit của toán hạng thứ nhất, toán hạng thứ hai quyết định số vị trí cần dịch chuyển.
- >> (shift phải): Lấy hai số, dịch chuyển phải các bit của toán hạng thứ nhất, toán hạng thứ hai quyết định số vị trí cần dịch chuyển.
- &^ (AND NOT): Đây là một toán tử bit rõ ràng.
Ví dụ:
// Minh họa chương trình Go dùng toán tử bitwise
package main
import "fmt"
func main() {
p:= 34
q:= 20
// & (bitwise AND)
result1:= p & q
fmt.Printf("Result of p & q = %d", result1)
// | (bitwise OR)
result2:= p | q
fmt.Printf("\nResult of p | q = %d", result2)
// ^ (bitwise XOR)
result3:= p ^ q
fmt.Printf("\nResult of p ^ q = %d", result3)
// << (left shift)
result4:= p << 1
fmt.Printf("\nResult of p << 1 = %d", result4)
// >> (right shift)
result5:= p >> 1
fmt.Printf("\nResult of p >> 1 = %d", result5)
// &^ (AND NOT)
result6:= p &^ q
fmt.Printf("\nResult of p &^ q = %d", result6)
}
Kết quả:
Kết quả của p & q = 0
Kết quả của p | q = 54
Kết quả của p ^ q = 54
Kết quả của p << 1 = 68
Kết quả của p >> 1 = 17
Kết quả của p &^ q = 34
Toán tử gán
Toán tử gán được sử dụng để gán giá trị cho một biến. Toán hạng bên trái của toán tử gán là một biến và toán hạng bên phải của toán tử gán là một giá trị. Giá trị bên phải phải có cùng kiểu dữ liệu với biến bên trái, nếu không trình biên dịch sẽ báo lỗi. Các loại toán tử gán khác nhau được hiển thị bên dưới:
- “=”(Gán đơn giản): Đây là toán tử gán đơn giản nhất. Toán tử này được sử dụng để gán giá trị bên phải cho biến bên trái.
- “+=”(Gán cộng): Toán tử này là sự kết hợp của các toán tử ‘+’ và ‘=’. Toán tử này trước tiên cộng giá trị hiện tại của biến bên trái với giá trị bên phải, sau đó gán kết quả cho biến bên trái.
- “-=”(Gán trừ): Toán tử này là sự kết hợp của các toán tử ‘-‘ và ‘=’. Toán tử này trước tiên trừ giá trị hiện tại của biến bên trái khỏi giá trị bên phải, sau đó gán kết quả cho biến bên trái.
- “*=”(Gán phép nhân): Toán tử này là sự kết hợp của các toán tử ‘*’ và ‘=’. Toán tử này trước tiên nhân giá trị hiện tại của biến bên trái với giá trị bên phải, sau đó gán kết quả cho biến bên trái.
- “/=”(Gán phép chia): Toán tử này là sự kết hợp của các toán tử ‘/’ và ‘=’. Toán tử này trước tiên chia giá trị hiện tại của biến bên trái cho giá trị bên phải, sau đó gán kết quả cho biến bên trái.
- “%=”(Gán phép chia lấy phần dư): Toán tử này là sự kết hợp của các toán tử ‘%’ và ‘=’. Toán tử này trước tiên lấy phần dư của giá trị hiện tại của biến bên trái cho giá trị bên phải, sau đó gán kết quả cho biến bên trái.
- “&=”(Gán phép AND theo bit): Toán tử này là sự kết hợp của các toán tử ‘&’ và ‘=’. Toán tử này trước tiên “AND theo bit” giá trị hiện tại của biến bên trái cho giá trị bên phải, sau đó gán kết quả cho biến bên trái.
- “^=”(Bitwise loại trừ OR): Toán tử này là sự kết hợp của các toán tử ‘^’ và ‘=’. Toán tử này trước tiên “Bitwise Exclusive OR” giá trị hiện tại của biến bên trái theo giá trị bên phải rồi gán kết quả cho biến bên trái.
- “|=”(Bitwise bao gồm OR): Toán tử này là sự kết hợp của các toán tử ‘|’ và ‘=’. Toán tử này trước tiên “Bitwise Inclusive OR” giá trị hiện tại của biến bên trái theo giá trị bên phải rồi gán kết quả cho biến bên trái.
- “<<=: Toán tử này là sự kết hợp của các toán tử ‘<<’ và ‘=’. Toán tử này trước tiên “Shift trái AND” giá trị hiện tại của biến bên trái theo giá trị bên phải rồi gán kết quả cho biến bên trái.
- “>>=”: Toán tử này là sự kết hợp của các toán tử ‘>>’ và ‘=’. Toán tử này đầu tiên “Shift phải AND” giá trị hiện tại của biến bên trái theo giá trị bên phải, sau đó gán kết quả cho biến bên trái.
Ví dụ:
// Minh họa chương trình Go dùng toán tử gán
package main
import "fmt"
func main() {
var p int = 45
var q int = 50
// “=”(Simple Assignment)
p = q
fmt.Println(p)
// “+=”(Add Assignment)
p += q
fmt.Println(p)
//“-=”(Subtract Assignment)
p-=q
fmt.Println(p)
// “*=”(Multiply Assignment)
p*= q
fmt.Println(p)
// “/=”(Division Assignment)
p /= q
fmt.Println(p)
// “%=”(Modulus Assignment)
p %= q
fmt.Println(p)
}
Kết quả:
50
100
50
2500
50
0
Toán tử khác
- &: Toán tử này trả về địa chỉ của biến.
- *: Toán tử này cung cấp con trỏ đến một biến.
- <-: Tên của toán tử này là nhận. Nó được sử dụng để nhận giá trị từ kênh.
// Minh họa chương trình sử dụng toán tử khác
package main
import "fmt"
func main() {
a := 4
// Dùng địa chỉ của toán tử (&) toán tử trỏ gián tiếp (*)
b := &a
fmt.Println(*b)
*b = 7
fmt.Println(a)
}
Kết quả:
4
7