Go 语言运算符概述📘
Go 语言运算符概述📘
学习环境:Windows + GoLand 2025.1.3 + Go SDK 1.24 + CodeGeeX(模块开发模式)
一、学习目标 🎯
- 掌握 Go 语言中各类运算符的基本用法
- 理解运算符的优先级和结合性
- 学会在不同数据类型上正确使用运算符
- 避免常见的运算符误用错误,如越界、类型不匹配等
- 熟悉 Go 中特有的运算符特性,如位操作、指针取值等
二、核心重点 🔑
序号 | 类别 | 内容说明 |
---|---|---|
1 | 分类全面 | 包括算术、关系、逻辑、位、赋值、指针、其他运算符 |
2 | 运算符优先级 | 明确各运算符之间的执行顺序 |
3 | 数据类型兼容 | 不同类型之间运算规则 |
4 | 特殊用法 | 如 & 、* 操作指针,<- 用于 channel 等 |
5 | 注意事项 | 避免类型不一致、越界、空指针等常见错误 |
三、详细讲解 📚
1. 算术运算符 🧮
知识详解 📝
用于执行基本的数学运算,包括加减乘除、取余、自增自减等。
支持的算术运算符:
运算符 | 含义 | 示例 |
---|---|---|
+ |
加法 | a + b |
- |
减法 | a - b |
* |
乘法 | a * b |
/ |
除法 | a / b |
% |
取模(仅限整数) | a % b |
++ |
自增 | a++ |
-- |
自减 | a-- |
实例 💡
package main
import "fmt"
func main() {
a, b := 10, 3
fmt.Println("a + b =", a + b) // 输出: 13
fmt.Println("a - b =", a - b) // 输出: 7
fmt.Println("a * b =", a * b) // 输出: 30
fmt.Println("a / b =", a / b) // 输出: 3
fmt.Println("a % b =", a % b) // 输出: 1
a++
fmt.Println("a++ =", a) // 输出: 11
}
注意点 ⚠️
- Go 不允许不同类型进行混合运算,需显式转换;
- 除以 0 会引发运行时 panic;
++
和--
只能作为语句使用,不能作为表达式嵌套。
技巧 ✨
- 使用
math.Round()
处理浮点数四舍五入; - 对于大整数计算可考虑使用
big.Int
类型。
2. 关系运算符 (比较运算符) 🤝
知识详解 📝
用于比较两个值之间的大小或相等关系,返回布尔值 true
或 false
。
运算符 | 含义 | 示例 |
---|---|---|
== |
等于 | a == b |
!= |
不等于 | a != b |
> |
大于 | a > b |
< |
小于 | a < b |
>= |
大于等于 | a >= b |
<= |
小于等于 | a <= b |
实例 💡
package main
import "fmt"
func main() {
x, y := 10, 20
fmt.Println("x == y:", x == y) // false
fmt.Println("x != y:", x != y) // true
fmt.Println("x > y:", x > y) // false
fmt.Println("x < y:", x < y) // true
}
注意点 ⚠️
- Go 不支持
<>
这样的非等价写法; - 字符串可以比较字典序;
- 指针也可以比较地址是否相同。
3. 逻辑运算符 🔍
知识详解 📝
用于组合多个布尔表达式,控制程序流程。
运算符 | 含义 | 示例 |
---|---|---|
&& |
逻辑与 | a > 0 && b < 0 |
|| |
逻辑或 | `a > 0 |
! |
逻辑非 | !(a == b) |
实例 💡
package main
import "fmt"
func main() {
a, b := true, false
fmt.Println("a && b:", a && b) // false
fmt.Println("a || b:", a || b) // true
fmt.Println("!a:", !a) // false
}
注意点 ⚠️
- Go 不支持短路求值以外的逻辑操作符重载;
- 逻辑运算符只能作用于布尔值,不能直接用于数字。
4. 位运算符 🔢
知识详解 📝
用于对整数类型的二进制位进行操作,常用于底层系统编程、加密算法等领域。
运算符 | 含义 | 示例 |
---|---|---|
& |
按位与 | a & b |
| |
按位或 | `a |
^ |
按位异或 | a ^ b |
&^ |
按位清除 | a &^ b |
<< |
左移 | a << n |
>> |
右移 | a >> n |
实例 💡
package main
import "fmt"
func main() {
a, b := 60, 13 // 二进制:a = 0011 1100, b = 0000 1101
fmt.Printf("a & b: %d\n", a & b) // 输出: 12 (0000 1100)
fmt.Printf("a | b: %d\n", a | b) // 输出: 61 (0011 1101)
fmt.Printf("a ^ b: %d\n", a ^ b) // 输出: 49 (0011 0001)
fmt.Printf("a << 2: %d\n", a << 2) // 输出: 240 (1111 0000)
fmt.Printf("a >> 2: %d\n", a >> 2) // 输出: 15 (0000 1111)
}
注意点 ⚠️
- 移位运算中的右操作数必须是无符号整数;
- 移位操作不会改变原值,而是返回新值;
- Go 不支持 C/C++ 中的
~
按位取反运算符,应使用^
。
5. 赋值运算符 💾
知识详解 📝
用于给变量赋值,Go 支持简单赋值和复合赋值。
运算符 | 含义 | 示例 |
---|---|---|
= |
赋值 | a = 10 |
+= |
加后赋值 | a += b |
-= |
减后赋值 | a -= b |
*= |
乘后赋值 | a *= b |
/= |
除后赋值 | a /= b |
%= |
取模后赋值 | a %= b |
&= , |= , ^= , <<= , >>= |
位运算后赋值 | a <<= 2 |
实例 💡
package main
import "fmt"
func main() {
var a int = 5
a += 3
fmt.Println("a += 3 =>", a) // 输出: 8
a >>= 1
fmt.Println("a >>= 1 =>", a) // 输出: 4
}
6. 指针运算符 🔍
知识详解 📝
Go 支持基本的指针操作,虽然不如 C/C++ 强大,但足够满足大多数场景需求。
运算符 | 含义 | 示例 |
---|---|---|
& |
取地址 | p := &a |
* |
解引用 | val := *p |
实例 💡
package main
import "fmt"
func main() {
a := 100
p := &a
fmt.Println("a 的地址:", p)
fmt.Println("a 的值:", *p)
*p = 200
fmt.Println("修改后的 a:", a)
}
输出结果:
a 的地址: 0xc0000180b8
a 的值: 100
修改后的 a: 200
注意点 ⚠️
- 不能对 nil 指针解引用,否则会引发 panic;
- Go 不支持指针运算(如
p++
); - 变量必须取地址后才能被赋值为指针。
7. 其他运算符 🧩
运算符 | 含义 | 示例 |
---|---|---|
chan<- / <-chan |
channel 发送/接收操作 | ch <- data / data := <- ch |
, |
多值赋值分隔符 | i, j = j, i |
_ |
忽略变量 | _ = someFunc() |
. |
结构体字段访问 | user.Name |
-> |
不存在!Go 中用 . 直接访问结构体指针字段 |
(*ptr).Name 或 ptr.Name |
8. 运算符优先级 🧠
Go 中的运算符有明确的优先级顺序,了解它有助于写出清晰、正确的表达式。以下是从高到低排列的部分常用运算符优先级表:
优先级 | 运算符 | 描述 |
---|---|---|
1 | ^ , ! , - , * , & |
单目运算符 |
2 | * , / , % , << , >> |
乘法、移位等 |
3 | + , - |
加减法 |
4 | == , != , < , <= , > , >= |
比较运算符 |
5 | & |
按位与 |
6 | ^ |
按位异或 |
7 | | |
按位或 |
8 | && |
逻辑与 |
9 | || |
逻辑或 |
📌 建议:在复杂表达式中尽量使用括号提高可读性和避免歧义。
四、总结 ✅
内容项 | 说明 |
---|---|
基础概念 | Go 支持丰富的运算符,涵盖算术、逻辑、位、指针、赋值等多个方面 |
使用方式 | 每种运算符都有其特定用途和语法规范,注意类型一致性 |
数据类型兼容 | 不同类型之间需要显式转换,不能混用 |
特殊用法 | 指针、channel、结构体访问等属于 Go 特有的运算符特性 |
注意事项 | 避免类型不一致、越界、空指针、除零等常见错误 |
🎉 恭喜你完成了《Go 语言运算符概述》的学习!
你现在掌握了 Go 中所有常用运算符的使用方法,理解了它们的作用范围、优先级以及注意事项。无论是编写业务逻辑还是处理底层系统代码,都能更加得心应手!
📌 下一步推荐学习:
- 《Go 控制结构详解》
- 《Go 函数定义与调用全解析》
- 《Go 指针与内存管理》
需要我继续输出这些内容吗?😊