引入

有了变量和常量,就得对它们做运算——加减乘除、比大小、判断条件、位操作。运算符就是干这些事的符号。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 条件判断,学学 ifswitch 怎么用运算符来控制程序的走向。