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++ // 6 | Go 中 ++/-- 是<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 = 10 | Go 有 := 短声明(函数内) | ||
| += -= *= /= %= | 复合赋值 | a += 3 // a=a+3 | |||
| &= |= ^= &^= | 位运算赋值 | a &= 3 | |||
| <<= >>= | 位移赋值 | a <<= 1 | |||
| 指针运算符 | |||||
| & | 取地址 | p := &a | 获取变量地址;Go 无指针算术 | ||
| * | 解引用 | v := *p | 访问指针指向的值;nil 解引用 panic | ||
| new() | 分配零值 | p := new(int) // *int | 返回指针;基本不用,多用 & 或结构体字面量 | ||
| make() | 创建切片/map/chan | m := make(map[string]int) | 返回已初始化的值(非指针) | ||
| nil | 空指针 | var p *int = nil | nil 只能与指针/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) | 类型switch | switch v := i.(type) | 仅在 switch 中使用,获取具体类型 | ||
| 类型转换 | |||||
| (T) | 类型转换 | a := int(3.14) // 3 | Go 不支持隐式转换,必须显式转换 | ||
| 内存分配 | |||||
| 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, a | Go 原生支持多值赋值交换 | ||
| ... | 可变参数 | 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
