Go 语言运算符概述📘

Go 语言运算符概述📘

学习环境:Windows + GoLand 2025.1.3 + Go SDK 1.24 + CodeGeeX(模块开发模式)


一、学习目标 🎯

  1. 掌握 Go 语言中各类运算符的基本用法
  2. 理解运算符的优先级和结合性
  3. 学会在不同数据类型上正确使用运算符
  4. 避免常见的运算符误用错误,如越界、类型不匹配等
  5. 熟悉 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. 关系运算符 (比较运算符) 🤝

知识详解 📝

用于比较两个值之间的大小或相等关系,返回布尔值 truefalse

运算符 含义 示例
== 等于 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).Nameptr.Name

8. 运算符优先级 🧠

Go 中的运算符有明确的优先级顺序,了解它有助于写出清晰、正确的表达式。以下是从高到低排列的部分常用运算符优先级表:

优先级 运算符 描述
1 ^, !, -, *, & 单目运算符
2 *, /, %, <<, >> 乘法、移位等
3 +, - 加减法
4 ==, !=, <, <=, >, >= 比较运算符
5 & 按位与
6 ^ 按位异或
7 | 按位或
8 && 逻辑与
9 || 逻辑或

📌 建议:在复杂表达式中尽量使用括号提高可读性和避免歧义。


四、总结 ✅

内容项 说明
基础概念 Go 支持丰富的运算符,涵盖算术、逻辑、位、指针、赋值等多个方面
使用方式 每种运算符都有其特定用途和语法规范,注意类型一致性
数据类型兼容 不同类型之间需要显式转换,不能混用
特殊用法 指针、channel、结构体访问等属于 Go 特有的运算符特性
注意事项 避免类型不一致、越界、空指针、除零等常见错误

🎉 恭喜你完成了《Go 语言运算符概述》的学习!
你现在掌握了 Go 中所有常用运算符的使用方法,理解了它们的作用范围、优先级以及注意事项。无论是编写业务逻辑还是处理底层系统代码,都能更加得心应手!


📌 下一步推荐学习:

  • 《Go 控制结构详解》
  • 《Go 函数定义与调用全解析》
  • 《Go 指针与内存管理》

需要我继续输出这些内容吗?😊

posted @ 2025-06-26 22:53  红尘过客2022  阅读(17)  评论(0)    收藏  举报