刚接触 Go 时,运算符看起来只是几个符号,但一旦放进表达式里,整数除法、布尔判断、位移和复合赋值就很容易混在一起。下面按“计算什么、返回什么、什么时候容易写错”的顺序整理 Go 里的常见运算符,并结合原始示例说明每类符号在代码中的实际作用,方便你在写条件、处理数值和阅读表达式时快速判断结果。
算术运算符:先看值怎么被算出来
算术运算符是最常见的一类,主要用于数值计算。Go 中常用的 +、-、*、/、% 分别表示加、减、乘、除和取余。
var a int = 5
var b int = 3
var c int
c = a + b // c等于a+b的值,8
c = a - b // c等于a-b的值,2
c = a * b // c等于a乘b的值,15
c = a / b // c等于a除b的整数值1,整数除整数返回整数,浮点数除浮点数返回浮点数
c = a % b // c等于a除b的余数2,取余(模)运算
这里最需要注意的是除法行为:int 与 int 相除,结果仍然是整数,所以 5 / 3 的结果是 1,而不是带小数的值。如果你想保留小数部分,就需要让参与运算的值变成浮点数。
另外,++ 和 -- 用来表示自增和自减:
var a int = 1
a++ // 自增运算,等同于 a = a + 1
a-- // 自减运算,等同于 a = a - 1
它们的意义很直接,本质上就是在原值基础上加 1 或减 1,适合计数、循环步进这类场景。
关系运算与逻辑运算:表达式什么时候返回 true
如果说算术运算是在算出一个数,那么关系运算和逻辑运算更像是在得出一个判断结果。它们的返回值都是 bool 类型,也就是 true 或 false。

关系运算符:比较两个值的大小或是否相等
== 和 != 用来判断两个值是否相等、是否不相等:

var a int = 5
var b int = 3
a == b // 返回fasle,判断a是否等于b
a != b // 返回true,判断a是否不等于b
对应地,>、>=、<、<= 分别表示大于、大于等于、小于、小于等于:
var a int = 5
var b int = 3
a > b // true
a >= b // true
a < b // false
a <= b // false
这类运算符常见于 if、for 条件、边界判断和数据比较中。只要记住一点:它们的结果不是新的数字,而是布尔值。
逻辑运算符:把多个判断拼成完整条件
当一个条件不够表达业务规则时,就需要逻辑运算符把多个判断连起来。Go 中常用的是 &&、|| 和 !,分别表示且、或、非。
var a bool = true
var b bool = false
var c bool
c = a && b // false, 如果逻辑符号两边都是true,则返回true,否则为false。
c = a || b // true , 如果逻辑符号两边只要有一个是true,则返回true,否则为false。
c = !a // false 取反,如果a为true,结果就是false,如果a为false,结果就是true。
可以把它理解为三种最基础的条件组合方式:
&&:两边都成立,整体才成立。||:两边只要有一边成立,整体就成立。!:把原来的真假结果反过来。
实际写条件时,关系运算通常负责“比较”,逻辑运算负责“连接”。两者配合起来,才是完整的判断表达式。
位运算符:直接处理二进制位
位运算更偏底层,它不是按十进制数值去理解,而是直接针对二进制位进行操作。在需要处理标记位、权限位、压缩状态值或底层数据时,这类运算很常见。
按位与、按位或、按位异或
&、|、^ 分别表示按位与、按位或、按位异或:
var a = 0b00111100
var b = 0b00001101
// & 按位与,将两数的二进制位相与运算,只有一个为0,与的结果就是0,否则为1。
fmt.Printf("%bn", a&b) // 0000 1100
// | 按位或,将两数的二进制位相或运算,只有一个为1,或的结果就是1,否则为0。
fmt.Printf("%bn", a|b) // 0011 1101
// ^ 按位异或,将两数相应的二进制位值不同则为1,否则为0。
fmt.Printf("%bn", a^b) // 0011 0001
理解这三者时,不妨只盯住“同一位上的 0 和 1 如何变化”:按位与偏向筛选,按位或偏向合并,按位异或偏向比较差异。
左移和右移
<< 和 >> 分别是左移和右移运算符,用来把二进制数整体向左或向右移动若干位。
// 左移运算符"<<",左移n位就是乘以2的n次方
// 右移运算符">>",右移n位就是除以2的n次方
var a = 0b00111100
fmt.Printf("%bn", a<<2) // 11110000
fmt.Printf("%bn", a>>2) // 00001111
在示例语境下,可以直接按“左移近似乘以 2 的 n 次方,右移近似除以 2 的 n 次方”来理解,这能帮助你快速判断结果变化方向。
赋值运算符:把结果写回变量
赋值运算符的作用,是把一个值保存到变量中。最基础的是 =:
| 运算符 | 描述 | 用法 |
|---|---|---|
| = | 将一个值赋给一个变量或常量 | c = a + b 将a+b的结果赋值给c |
var a int = 5
var b int = 3
var c int = a + b // 将a+b的结果赋值给c
在日常开发里,更常见的是复合赋值。它的好处是把“先运算、再赋值”压缩成一个符号,表达更紧凑。
算术复合赋值
| 运算符 | 描述 | 用法 |
|---|---|---|
| += | 相加后再赋值 | c += a 等于 c = c + a |
| -= | 相减后再赋值 | c -= a 等于 c = c - a |
| *= | 相乘后再赋值 | c *= a 等于 c = c * a |
| /= | 相除后再赋值 | c /= a 等于 c = c / a |
| %= | 求余后再赋值 | c %= a 等于 c = c % a |
位运算复合赋值
| 运算符 | 描述 | 用法 |
|---|---|---|
| <<= | 左移后赋值 | c <<= 2 等于 c = c << 2 |
| >>= | 右移后赋值 | c >>= 2 等于 c = c >> 2 |
| &= | 按位与后赋值 | c &= 2 等于 c = c & 2 |
| ^= | 按位异或后赋值 | c ^= 2 等于 c = c ^ 2 |
| |= | 按位或后赋值 | c |= 2 等于 c = c | 2 |
这类写法的重点不是新语法,而是读法要顺:先看变量当前值,再看运算符,最后看它会把什么结果重新写回原变量。
其他运算符与优先级:读懂复杂表达式的关键
其他运算符
在 Go 中,& 和 * 还有另一层含义,常见于指针相关代码:

| 运算符 | 描述 | 实例 |
|---|---|---|
| & | 返回变量存储地址 | &a 将返回变量的存储地址 |
| * | 指针变量 | *a 是一个指针变量 |
这也说明一个符号在不同上下文中可能承担不同作用,阅读时不能只看字符本身,还要看它出现在什么表达式里。
运算符优先级
当一个表达式里同时出现多种运算符时,优先级决定谁先计算。这一点和数学里的“先乘除、后加减”是同一个思路。
下面这组顺序表示 Go 中由高到低的优先级:
| 优先级 | 运算符 |
|---|---|
| 5 | * / % << >> & &^ |
| 4 | + - | ^ |
| 3 | == != < <= > >= |
| 2 | && |
| 1 | || |
实际使用时,优先级表不一定需要死记,但至少要建立两个判断习惯:一是关系运算通常晚于算术运算,二是逻辑运算往往发生在比较结果之后。遇到较长表达式时,加上括号通常能让代码意图更清楚,也能减少误读。









