乐宁工具

Go (Golang) 运算符对照表

免费使用 超详细版 可复制

Go (Golang) 运算符完整速查表,涵盖算术、比较、逻辑、位运算(含 Go 特有 &^)、赋值、指针(* &)、通道 <-、make/new、类型断言、可变参数 ...、优先级等全部内容。

分类运算符名称示例代码结果说明 / 注意事项
算术运算符
+加法a := 3 + 2 // 5也可用于字符串拼接:\"a\"+\"b\"=\"ab\"
-减法a := 5 - 3 // 2
*乘法a := 4 * 3 // 12不要与指针解引用混淆(看操作数个数)
/除法a := 7 / 3 // 2整数除法截断;浮点除法保留小数
%取模a := 7 % 3 // 1结果符号与被除数相同
++自增a := 5; a++ // 6Go 中 ++/-- 是<strong>语句</strong>不是表达式,不能 b = a++
--自减a := 5; a-- // 4仅支持后缀形式,不支持前缀 ++a
关系运算符
==等于5 == 5 // true结构体逐字段比较;切片/map/func 不可比较
!=不等于5 != 3 // true
>大于5 > 3 // true
<小于3 < 5 // true
>=大于等于5 >= 5 // true
<=小于等于3 <= 5 // true
逻辑运算符
&&逻辑与(短路)true && false // false左为 false 时右不求值
||逻辑或(短路)true || false // true左为 true 时右不求值
!逻辑非!true // false
位运算符
&按位与5 & 3 // 1 (0101&0011)对应位都为1才为1
|按位或5 | 3 // 7
^按位异或5 ^ 3 // 6相同为0不同为1;异或自身得0
&^位清除(AND NOT)5 &^ 3 // 4 (0101 &^ 0011=0100)Go 特有:清除右侧为1的位
~按位取反~5 // -6 (Go 1.13+)等价于 ^(x+1);仅用于整数
<<左移5 << 1 // 10左移n位 = 乘以2^n
>>右移-8 >> 1 // -4算术右移(保留符号)
赋值运算符
=赋值a := 10 或 var a = 10Go 有 := 短声明(函数内)
+= -= *= /= %=复合赋值a += 3 // a=a+3
&= |= ^= &^=位运算赋值a &= 3
<<= >>=位移赋值a <<= 1
指针运算符
&取地址p := &a获取变量地址;Go 无指针算术
*解引用v := *p访问指针指向的值;nil 解引用 panic
new()分配零值p := new(int) // *int返回指针;基本不用,多用 & 或结构体字面量
make()创建切片/map/chanm := make(map[string]int)返回已初始化的值(非指针)
nil空指针var p *int = nilnil 只能与指针/slice/map/chan/func/interface 比较
通道运算符
<-发送ch <- 10向通道发送值;通道必须已初始化
<-接收v := <-ch从通道接收值;ok,v := <-ch 可检测关闭
<-通道方向func f(in <-chan int)只收/只发通道;函数参数中限定方向
类型断言
.(Type)类型断言v := i.(string)失败 panic;安全写法:v, ok := i.(string)
.(type)类型switchswitch v := i.(type)仅在 switch 中使用,获取具体类型
类型转换
(T)类型转换a := int(3.14) // 3Go 不支持隐式转换,必须显式转换
内存分配
new(T)零值指针p := new(int) // *int → 0与 C++ new 不同:不调用构造函数
make(T,size)初始化s := make([]int, 5)仅用于 slice/map/channel
特殊运算符
,短声明(多值)a, b := 1, 2:= 可同时声明多个变量
,交换a, b = b, aGo 原生支持多值赋值交换
...可变参数func f(args ...int)函数参数中表示可变数量
...展开切片f(slice...)调用时将切片展开为多个参数
<-接收(已在通道)已归类
地址/解引用陷阱
*p = 1通过指针修改a=1; p=&a; *p=2 // a=2指针传递可实现"引用语义"
方法接收者func (p *T) Method()指针接收者可修改原值值接收者操作副本
优先级(高→低)
. [] (T)成员/下标/类型转换obj.Field / a[0] / int(x)最高
++ --后缀自增自减a++ / a--比 C 优先级低,是语句
* & <-指针/地址/通道*p / &a / <-ch单目
! ~ + -逻辑非/取反/正负!flag / ~a / -a
* / %乘除模a*b/c
+ -加减a+b
<< >>位移
&按位与
^按位异或
|按位或
== != < > <= >=关系比较
&&逻辑与
||逻辑或
优先级(最低)
= += 等赋值从右向左结合

Go 运算符注意事项

  • • Go 没有 ++a 前缀自增,只有后缀 a++,且是语句不是表达式(不能 b = a++
  • • Go 不支持隐式类型转换,不同类型运算必须显式转换:int32(a) + int32(b)
  • &^ 是 Go 特有运算符(AND NOT):清除右侧为 1 的位
  • ~(按位取反)Go 1.13+ 才支持,之前需用 ^ 配合异或技巧
  • == 可比较结构体(逐字段),但切片、map、func 不可比较(编译错误)
  • nil 只能与指针、slice、map、channel、func、interface 比较;不能与基本类型比较
  • <- 通道运算符方向:ch <- x 发送,x := <-ch 接收;关闭的通道接收返回零值
  • make 返回已初始化的值(非指针),new 返回零值指针
  • • 类型断言 i.(T) 失败会 panic;安全写法 v, ok := i.(T)
  • • Go 没有三元运算符 ?:,用 if-else 替代(官方刻意不加入)

* 和 &

Go 指针不能做算术;用指针接收者方法修改原值

<- 通道

ch <- x 发送;x := <-ch 接收;ok 检测关闭

&^ 位清除

Go 特有:5 &^ 3 = 4;清除右操作数为1的位

类型断言

v, ok := i.(T) 安全断言;失败 ok=false 不 panic