跳到主要内容

03 运算符

本节目标:熟悉 Go 的算术、比较、逻辑、赋值运算符,注意和其他语言不同的地方。

一、算术运算符

运算符含义示例结果
+5 + 27
-5 - 23
*5 * 210
/5 / 22(整数除法截断!)
%取余5 % 21
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) // 清晰明了,不用背优先级表

大致规律:单目运算符 > 乘除 > 加减 > 比较 > && > ||


练习

  1. 写程序判断一个年份是否是闰年(能被 4 整除但不能被 100 整除,或能被 400 整除)。
  2. 已知总秒数 total := 3725,用 /% 计算出它等于几小时几分钟几秒。
  3. 试着写 x := i++,看看编译器报什么错。

下一节:04 流程控制