说实话,要记住多种不同编程语言的语法和功能确实很让人头疼。我就曾经在使用不同语言的过程中,发现自己忘记了 Go 的某个可以让代码更简洁、高效的功能。因此我决定为 Go 编写这份小册子,帮助那些想深入了解 Go 强大功能的开发人员,让他们不用一直琢磨:"等等,我该怎么做?"
数组和切片操作
Go 的数组和切片是处理集合的基本数据结构:
数据结构 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
Array |
| O(1) | O(n) | 声明一个固定大小为 |
| O(1) | O(1) | 访问指定索引处的元素。 | |
| O(1) | O(1) | 更新指定索引处的元素。 |
切片
数据结构 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
Slice |
| O(1) | O(1) | 从数组或另一个切片创建切片。 |
| O(1) | O(n) | 创建具有指定长度和容量的切片。 | |
| 分摊 O(1) | O(n) | 将元素追加到切片尾部。 | |
| O(1) | O(1) | 返回切片中元素个数。 | |
| O(1) | O(1) | 返回切片容量。 | |
| O(n) | O(1) | 将元素从 |
Map 和结构操作
数据结构 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
Map |
| O(1) | O(n) | 创建一个新的空映射,键类型为 |
| 平均 O(1) | O(1) | 在映射中插入或更新键值对。 | |
| 平均 O(1) | O(1) | 检索与键关联的值。 | |
| 平均 O(1) | O(1) | 从映射中删除键值对。 | |
| 平均 O(1) | O(1) | 检查映射中是否存在键。 | |
| O(1) | O(1) | 返回映射中键值对的个数。 |
结构
数据结构 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
Struct |
| O(1) | O(1) | 定义新数据类型 |
| O(1) | O(1) | 创建 | |
| O(1) | O(1) | 访问或修改结构体中的字段。 | |
Embedded Structs | O(1) | O(1) | 结构体可以包含其他结构体。 | |
Tags | O(1) | O(1) | 结构字段可以有元数据标记。 |
字符串和迭代器操作
函数 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
Length |
| O(1) | O(1) | 返回字符串长度。 |
Concatenation |
| O(n) | O(n) | 连接两个字符串。 |
Substring |
| O(1) | O(1) | 从字符串中获取子串。 |
Contains |
| O(n) | O(1) | 检查 |
Split |
| O(n) | O(n) | 用 |
Replace |
| O(n) | O(n) | 将‘ old ’替换为‘ new ’。 |
ToUpper |
| O(n) | O(n) | 将字符串转换为大写。 |
TrimSpace |
| O(n) | O(n) | 去除字符串前后的空白。 |
Index |
| O(n) | O(1) | 返回 |
Join |
| O(n) | O(n) | 将切片的元素连接成单个字符串。 |
迭代
循环类型 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
For Loop |
| O(n) | O(1) | 从 |
For Range |
| O(n) | O(1) | 迭代集合中的元素。 |
Infinite Loop |
| 看情况 | O(1) | 创建无限循环,直到满足中断条件。 |
Goroutine
操作 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
Start |
| O(1) | O(1) | 启动一个执行 |
通道(Channel)
操作 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
Create |
| O(1) | O(1) | 创建类型为 |
Buffered |
| O(1) | O(n) | 创建特定容量的缓冲通道。 |
Send |
| O(1) | O(1) | 向通道发送值。 |
Receive |
| O(1) | O(1) | 从通道接收值。 |
Close |
| O(1) | O(1) | 关闭通道。 |
Select |
| O(1) per case | O(1) | 等待多通道操作。 |
Default Case |
| O(1) | O(1) | 当没有其他事件发生时执行。 |
同步原语
原语 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
WaitGroup |
| O(1) | O(1) | 同步多个 goroutine。 |
| O(1) | O(1) | 向WaitGroup计数器增加 | |
| O(1) | O(1) | WaitGroup计数器减1。 | |
| O(1) | O(1) | 阻塞直到WaitGroup计数器为零。 | |
Mutex |
| O(1) | O(1) | 确保临界区互斥。 |
| O(1) | O(1) | 锁定互斥对象。 | |
| O(1) | O(1) | 解锁互斥对象。 | |
RWMutex |
| O(1) | O(1) | 允许多读单写。 |
| O(1) | O(1) | 锁定读互斥锁。 | |
| O(1) | O(1) | 解锁读互斥锁。 | |
| O(1) | O(1) | 锁定写互斥锁。 | |
| O(1) | O(1) | 解锁写互斥锁。 | |
Once |
| O(1) | O(1) | 确保函数只被调用一次。 |
| O(1) | O(1) | 如果尚未完成,则调用该函数。 | |
Cond |
| O(1) | O(1) | 实现条件变量。 |
| O(1) | O(1) | 等待信号。 | |
| O(1) | O(1) | 唤醒一个等待的 goroutine。 | |
| O(1) | O(1) | 唤醒所有等待的 goroutine。 |
文件 I/O 和系统操作
操作 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
Open File |
| O(1)* | O(1) | 打开准备读取的文件。 |
Create File |
| O(1)* | O(1) | 创建或打开用于写入的文件。 |
Read |
| O(n)* | O(1) | 将数据读取到缓冲区 |
Write |
| O(n)* | O(1) | 将数据从 |
Close |
| O(1)* | O(1) | 关闭文件。 |
Stat |
| O(1)* | O(1) | 获取文件信息。 |
Remove |
| O(1)* | O(1) | 删除文件。 |
错误处理和调试
操作 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
Create |
| O(1) | O(1) | 创建带描述消息的新错误。 |
Return |
| O(1) | O(1) | 返回错误。 |
Check |
| O(1) | O(1) | 检查是否发生错误。 |
Wrap Error |
| O(1) | O(1) | 用附加上下文包装现有错误。 |
Unwrap |
| O(1) | O(1) | 检索链中的下一个错误。 |
Is |
| O(n) | O(1) | 检查错误是否与目标错误匹配。 |
As |
| O(n) | O(1) | 检查是否可以将错误强制转换为特定类型。 |
调试
工具 | 语法 | 描述 |
|
| 为调试目的格式化并打印变量。 |
|
| 记录错误消息并退出。 |
|
| 停止执行并打印堆栈跟踪。 |
|
| 从延迟函数的panic中恢复。 |
反射
操作 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
Get Type |
| O(1) | O(1) | 获取 |
Get Value |
| O(1) | O(1) | 获取 |
Set Value |
| O(1) | O(1) | 设置新值; |
Kind |
| O(1) | O(1) | 获取类型种类 ( |
NumField |
| O(1) | O(1) | 获取结构中字段的数目。 |
Field |
| O(1) | O(1) | 通过索引访问字段。 |
同步软件包
原语 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
sync.Map |
| O(1) | O(n) | 支持并发安全的映射。 |
| O(1) | O(1) | 保存键值对。 | |
| O(1) | O(1) | 通过键获取值。 | |
| O(1) | O(1) | 删除键值对。 | |
| O(n) | O(1) | 迭代所有键值对。 | |
sync.Pool |
| O(1) | O(n) | 临时对象池。 |
| O(1) | O(1) | 从池中检索对象。 | |
| O(1) | O(1) | 返回对象到对象池。 |
上下文软件包
操作 | 语法 | 描述 |
Background |
| 返回空上下文。 |
WithCancel |
| 创建一个可取消的上下文。 |
WithTimeout |
| 设置超时时间。 |
WithValue |
| 向上下文添加一个值。 |
Done |
| 等待上下文被取消或超时。 |
Err |
| 返回错误,解释上下文被取消的原因。 |
JSON 编解码
操作 | 语法 | 时间复杂度 | 空间复杂度 | 描述 |
Marshal |
| O(n) | O(n) | 将 Go 值 |
Unmarshal |
| O(n) | O(n) | 将JSON数据解析为 Go 值 |
Decoder |
| O(1) | O(1) | 从 |
Encoder |
| O(1) | O(1) | 创建一个写入 |
从基础数据结构、并发性到高级系统操作和错误处理,本手册是深入探索 Golang 的入口,但真正的探索始于你自己的项目和贡献。