运算符与表达式 -《Go语言实战指南》
>Go 语言提供了一整套简洁且强大的运算符,用于数值计算、逻辑判断、赋值操作等。本章将带你系统了解 Go 中各类运算符及其组合表达式的使用方法。
---
### 一、运算符分类总览
| 运算符类型 | 示例 | 说明 | | |
| ----- | ------------------ | ------------ | ------------ | ----------- |
| 算术运算符 | `+ - * / %` | 加减乘除取余 | | |
| 赋值运算符 | `= += -= *= /= %=` | 基础赋值与复合赋值 | | |
| 比较运算符 | `== != > < >= <=` | 常用于条件判断 | | |
| 逻辑运算符 | \`&& | | !\` | 与、或、非(布尔运算) |
| 位运算符 | \`& | ^ &^ << >>\` | 位与、或、异或、位清零等 | |
| 其他运算符 | `&* <- <-chan` | 指针、通道等相关运算符 | | |
---
### 二、算术运算符
```go
a := 10
b := 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
```
> 注意:整数除法会自动舍去小数部分,使用浮点数可保留精度。
---
### 三、赋值运算符
Go 支持基础赋值和复合赋值:
```go
x := 5
x += 3 // 等价于 x = x + 3
x *= 2 // 等价于 x = x * 2
```
可用运算符包括:`+= -= *= /= %=`
---
### 四、比较运算符
```go
a := 5
b := 10
fmt.Println(a == b) // false
fmt.Println(a != b) // true
fmt.Println(a < b) // true
fmt.Println(a >= b) // false
```
* 用于数值、布尔值、字符串、数组等的比较;
* 不支持对 map、slice、function 进行直接比较。
---
### 五、逻辑运算符(布尔逻辑)
```go
x := true
y := false
fmt.Println(x && y) // false
fmt.Println(x || y) // true
fmt.Println(!x) // false
```
* `&&`:逻辑与,两个都为真才为真;
* `||`:逻辑或,任一为真即为真;
* `!`:逻辑非,取反。
---
### 六、位运算符(适用于整数类型)
```go
a := 5 // 0101
b := 3 // 0011
fmt.Println(a & b) // 1 (0001)
fmt.Println(a | b) // 7 (0111)
fmt.Println(a ^ b) // 6 (0110)
fmt.Println(a &^ b) // 4 (0100) 清除 b 中为 1 的位
fmt.Println(a << 1) // 10(左移)
fmt.Println(a >> 1) // 2 (右移)
```
---
### 七、自增与自减(Go 1.14 起不可作为表达式)
```go
i := 0
i++ // 等价于 i = i + 1
i-- // 等价于 i = i - 1
```
> 注意:Go 中 `i++` 不能写在赋值语句或表达式中,如 `j := i++` 是非法的。
---
### 八、优先级与结合性
| 优先级(从高到低) | 运算符 | | |
| --------- | ---------------------- | --- | -- |
| 1 | `* / % << >> & &^` | | |
| 2 | \`+ - | ^\` | |
| 3 | `== != < <= > >=` | | |
| 4 | `&&` | | |
| 5 | \` | | \` |
| 6 | 赋值运算符(如 `=` `+=` `-=`) | | |
> 建议使用括号明确优先级,提升可读性。
---
### 九、表达式的使用场景
```go
// 条件判断
if x > 0 && x < 100 {
fmt.Println("x 在区间 (0,100) 内")
}
// 赋值表达式
a := 3
a *= 2 + 1 // 等价于 a = a * (2 + 1)
```
---
### 十、小结
* 运算符是表达式的基本构建单元,需熟练掌握;
* Go 不支持运算符重载;
* 使用括号提高表达式清晰度;
* 位运算适用于性能敏感或底层编程场景。