03 运算符
本节目标:熟悉 Go 的算术、比较、逻辑、赋值运算符,注意和其他语言不同的地方。
一、算术运算符
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
+ | 加 | 5 + 2 | 7 |
- | 减 | 5 - 2 | 3 |
* | 乘 | 5 * 2 | 10 |
/ | 除 | 5 / 2 | 2(整数除法截断!) |
% | 取余 | 5 % 2 | 1 |
fmt.Println(5 / 2) // 2
fmt.Println(5.0 / 2) // 2.5(有浮点数参与才是浮点除法)
fmt.Println(5 % 2) // 1
fmt.Println(-5 % 2) // -1(余数符号跟随被除数)
自增自减:只有 ++ 和 --,且是语句不是表达式
i := 0
i++ // ✅ i 变成 1
i-- // ✅ i 变回 0
x := i++ // ❌ 编译报错!++ 不能出现在赋值右边
++i // ❌ 编译报错!Go 没有前缀写法
这是 Go 刻意的简化:++/-- 只能单独成一行,避免 C 语言里 a[i++] = i 这类混乱代码。
二、比较运算符
结果都是 bool 类型:
| 运算符 | 含义 |
|---|---|
== | 等于 |
!= | 不等于 |
> < >= <= | 大小比较 |
fmt.Println(3 == 3) // true
fmt.Println("abc" == "abc") // true(字符串可以直接用 == 比较,比 Java 友好!)
fmt.Println("a" < "b") // true(按字典序)
注意:只有相同类型才能比较。3 == 3.0 里如果两边是 int 变量和 float64 变量,会编译报错。
三、逻辑运算符
| 运算符 | 含义 | 示例 |
|---|---|---|
&& | 与(并且) | a > 0 && a < 10 |
|| | 或(或者) | a < 0 || a > 100 |
! | 非(取反) | !isDone |
age := 20
hasTicket := true
if age >= 18 && hasTicket {
fmt.Println("可以入场")
}
短路求值
&& 左边为 false 时,右边不会执行;|| 左边为 true 时同理。常用来做安全检查:
// 如果 len(s) == 0 为 true,s[0] 就不会执行,避免越界
if len(s) > 0 && s[0] == 'A' {
// ...
}
四、赋值运算符
x := 10
x += 5 // x = x + 5 → 15
x -= 3 // 12
x *= 2 // 24
x /= 4 // 6
x %= 4 // 2
五、位运算符(了解即可)
新手阶段很少用到,认识就行:
| 运算符 | 含义 |
|---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
<< >> | 左移 / 右移 |
fmt.Println(1 << 3) // 8(1 左移 3 位,相当于乘 2³)
六、Go 没有的运算符(其他语言转来的注意!)
| 其他语言有 | Go 的替代方案 |
|---|---|
三元运算符 a ? b : c | 老老实实写 if/else |
**(幂运算) | math.Pow(2, 10) |
前缀 ++i | 只有后缀 i++,且只能单独成行 |
// Go 没有三元运算符,想写 max = a > b ? a : b 只能:
max := a
if b > a {
max = b
}
这又是 Go "宁可啰嗦也要清晰"哲学的体现。
七、运算优先级
记不住优先级没关系,加括号就是最好的实践:
result := (a + b) * c / (d - e) // 清晰明了,不用背优先级表
大致规律:单目运算符 > 乘除 > 加减 > 比较 > && > ||。
练习
- 写程序判断一个年份是否是闰年(能被 4 整除但不能被 100 整除,或能被 400 整除)。
- 已知总秒数
total := 3725,用/和%计算出它等于几小时几分钟几秒。 - 试着写
x := i++,看看编译器报什么错。
下一节:04 流程控制