Go 语言运算符详解
Go 语言提供了丰富的运算符(Operator),用于执行各种操作,如算术、逻辑、位运算等。本文将详细介绍 Go 语言的运算符及其用法。
1. Go 语言运算符分类
Go 语言的运算符主要包括以下几类:
| 运算符类别 | 运算符 | 描述 |
|---|---|---|
| 算术运算符 | + - * / % ++ -- | 基本数学运算 |
| 关系运算符 | == != > < >= <= | 比较两个值 |
| 逻辑运算符 | && || ! | 逻辑判断 |
| 位运算符 | & | ^ << >> | 按位计算 |
| 赋值运算符 | = += -= *= /= %= &= |= ^= <<= >>= | 赋值操作 |
| 指针运算符 | & * | 取地址、解引用 |
| 其它运算符 | , . () [] | 逗号、结构体访问、函数调用、数组索引 |
2. 算术运算符
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
fmt.Println(a % b) // 取模(余数):1
注意:
/对整数取整,不会保留小数。- 自增(
++)和自减(--)不能作为表达式,只能独立使用:
a := 5
a++ // 正确 ✅
b := a++ // ❌ 错误,Go 不允许 `b = a++`
3. 关系运算符
关系运算符用于比较两个值,返回布尔值 true 或 false:
x, y := 5, 10
fmt.Println(x == y) // false
fmt.Println(x != y) // true
fmt.Println(x > y) // false
fmt.Println(x < y) // true
fmt.Println(x >= y) // false
fmt.Println(x <= y) // true
4. 逻辑运算符
逻辑运算符用于布尔类型的逻辑运算:
p, q := true, false
fmt.Println(p && q) // false(逻辑与)
fmt.Println(p || q) // true(逻辑或)
fmt.Println(!p) // false(逻辑非)
短路特性(Short-circuiting)
&&:若左侧为false,右侧不会执行。||:若左侧为true,右侧不会执行。
5. 位运算符
位运算符用于按位操作整数:
a, b := 5, 3 // 5: 101, 3: 011
fmt.Println(a & b) // 1 (按位与)
fmt.Println(a | b) // 7 (按位或)
fmt.Println(a ^ b) // 6 (按位异或)
fmt.Println(a << 1) // 10 (左移一位,相当于乘 2)
fmt.Println(a >> 1) // 2 (右移一位,相当于除 2)
6. 赋值运算符
| 运算符 | 作用 |
|---|---|
= | 赋值 |
+= -= *= /= %= | 复合赋值 |
&= |= ^= <<= >>= | 位运算赋值 |
示例:
a := 10
a += 5 // 等价于 a = a + 5
fmt.Println(a) // 15
7. 指针运算符
| 运算符 | 作用 |
|---|---|
& | 取地址 |
* | 取值(解引用) |
示例:
var num int = 42
var ptr *int = &num // 取 num 的地址
fmt.Println(ptr) // 地址值
fmt.Println(*ptr) // 42(解引用)
8. 逗号(,)运算符
在多变量赋值时使用:
a, b := 1, 2
a, b = b, a // 交换变量
fmt.Println(a, b) // 2 1
9. 特殊运算符
(1)点运算符 .
用于访问结构体字段:
type Person struct {
Name string
Age int
}
p := Person{Name: "Alice", Age: 25}
fmt.Println(p.Name) // 访问 Name 字段
(2)函数调用 ()
用于调用函数:
func greet() {
fmt.Println("Hello, Go!")
}
greet() // 调用函数
(3)索引运算符 []
用于访问数组、切片、映射:
arr := []int{10, 20, 30}
fmt.Println(arr[1]) // 20
10. 运算符优先级
| 优先级 | 运算符 |
|---|---|
| 1(最高) | * / % << >> & &^ |
| 2 | + - | ^ |
| 3 | == != < <= > >= |
| 4 | && |
| 5(最低) | || |
示例:
result := 10 + 2 * 5 // 先计算 `2*5`,然后加 `10`
fmt.Println(result) // 20
括号 () 最高优先级
result := (10 + 2) * 5 // 先计算 `10+2`,再乘以 `5`
fmt.Println(result) // 60
总结
| 运算符类别 | 运算符 | 示例 |
|---|---|---|
| 算术运算 | + - * / % ++ -- | a + b |
| 关系运算 | == != > < >= <= | a > b |
| 逻辑运算 | && || ! | a && b |
| 位运算 | & | ^ << >> | a & b |
| 赋值运算 | = += -= *= /= %= &= |= ^= <<= >>= | a += 1 |
| 指针运算 | & * | ptr = &a |
| 其它运算 | , . () [] | a, b = b, a |