引入
有了变量和常量,就得对它们做运算——加减乘除、比大小、判断条件、位操作。运算符就是干这些事的符号。Go 的运算符和大多数语言类似,但有几个细节值得注意,比如没有自增自减表达式、整数除法是截断的。
正文
定义
定义
运算符是对变量或值进行操作的符号。Go 支持算术、比较、逻辑、位运算和赋值运算符,运算符优先级和 C 语言基本一致。
语法
// 算术
a + b
a - b
a * b
a / b
a % b
// 比较
a == b
a != b
a > b
// 逻辑
a && b
a || b
!a
// 赋值
a += b
a -= b例子
算术运算符
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 的 ++ 和 -- 是语句不是表达式,不能用在表达式里:
i := 0
i++ // 正确
// x := i++ // 错误,不能赋值比较运算符
x := 10
y := 20
fmt.Println(x == y) // false
fmt.Println(x != y) // true
fmt.Println(x > y) // false
fmt.Println(x <= y) // true比较结果永远是 bool 类型,只能用于条件判断,不能像 C 那样当整数用。
逻辑运算符
age := 25
hasID := true
// &&:两边都为 true 才返回 true
if age >= 18 && hasID {
fmt.Println("允许进入")
}
// ||:任意一边为 true 就返回 true
if age < 12 || age > 65 {
fmt.Println("免费入场")
}
// !:取反
if !hasID {
fmt.Println("请出示证件")
}Go 的逻辑运算符支持短路求值:&& 左边为 false 时右边不计算,|| 左边为 true 时右边不计算。
位运算符
a := 0b1100 // 12
b := 0b1010 // 10
fmt.Printf("%04b\n", a&b) // 1000 按位与
fmt.Printf("%04b\n", a|b) // 1110 按位或
fmt.Printf("%04b\n", a^b) // 0110 按位异或
fmt.Printf("%04b\n", a<<1) // 11000 左移
fmt.Printf("%04b\n", a>>1) // 0110 右移
fmt.Printf("%04b\n", ^a) // 取反位运算在处理权限标志、网络协议、算法题时经常用到。
赋值运算符
n := 10
n += 5 // n = 15
n -= 3 // n = 12
n *= 2 // n = 24
n /= 4 // n = 6
n %= 4 // n = 2
n &= 1 // n = 0赋值运算符是 运算 + 赋值 的简写,代码更简洁。
常见写法
| 运算符 | 说明 | 示例 |
|---|---|---|
+ - * / % | 算术运算 | a + b |
== != > < >= <= | 比较运算 | a == b |
&& || ! | 逻辑运算 | a && b |
& | ^ << >> | 位运算 | a & b |
+= -= *= /= %= | 赋值运算 | a += b |
++ -- | 自增自减(语句) | i++ |
特点
- Go 没有三元运算符
? :,条件赋值只能用if-else ++--是语句,不能放在表达式里(比如x = i++是错的)- 整数除法截断小数,
7 / 2结果是3 - 位运算
^作为一元运算符时是取反,二元运算符时是异或 - 比较运算符结果是
bool,不能和整数混用 - 短路求值可以用来安全地检查条件:
if ptr != nil && ptr.Value > 0
理解
Go 的运算符设计上做了减法:没有三元运算符、++ 不能当表达式用、比较结果只能是布尔值。这些限制反而让代码更清晰,减少了 C 语言那种 if (a = b) 的坑。运算符本身没什么花活,就是多写多练,写多了就熟了。
引出
运算符最直接的用途就是做条件判断。接下来看 Go 条件判断,学学 if、switch 怎么用运算符来控制程序的走向。