本文提供了一份详尽的 Golang速查表格,涵盖了数据结构、控制流、错误处理、反思等多个方面的语法和功能,以帮助开发者高效使用 Golang。原文:Go Ultimate: The ultimate go cheatsheet you’ll ever need
说实话,要记住多种不同编程语言的语法和功能确实很让人头疼。我就曾经在使用不同语言的过程中,发现自己忘记了 Go 的某个可以让代码更简洁、高效的功能。因此我决定为 Go 编写这份小册子,帮助那些想深入了解 Go 强大功能的开发人员,让他们不用一直琢磨:"等等,我该怎么做?"
数组和切片操作
Go 的数组和切片是处理集合的基本数据结构:
数据结构 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
Array |
var arr [n]T |
O(1) |
O(n) |
声明一个固定大小为 n 、类型为 T 的数组。 |
|
arr[index] |
O(1) |
O(1) |
访问指定索引处的元素。 |
|
arr[index] = value |
O(1) |
O(1) |
更新指定索引处的元素。 |
切片
数据结构 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
Slice |
slice := arr[start:end] |
O(1) |
O(1) |
从数组或另一个切片创建切片。 |
|
slice := make([]T, length, capacity) |
O(1) |
O(n) |
创建具有指定长度和容量的切片。 |
|
append(slice, value) |
分摊 O(1) |
O(n) |
将元素追加到切片尾部。 |
|
len(slice) |
O(1) |
O(1) |
返回切片中元素个数。 |
|
cap(slice) |
O(1) |
O(1) |
返回切片容量。 |
|
copy(dst, src) |
O(n) |
O(1) |
将元素从 src 拷贝到 dst 。 |
Map 和结构操作
数据结构 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
Map |
m := make(map[K]V) |
O(1) |
O(n) |
创建一个新的空映射,键类型为 K ,值类型为 V 。 |
|
m[key] = value |
平均 O(1) |
O(1) |
在映射中插入或更新键值对。 |
|
value = m[key] |
平均 O(1) |
O(1) |
检索与键关联的值。 |
|
delete(m, key) |
平均 O(1) |
O(1) |
从映射中删除键值对。 |
|
value, exists := m[key] |
平均 O(1) |
O(1) |
检查映射中是否存在键。 |
|
len(m) |
O(1) |
O(1) |
返回映射中键值对的个数。 |
结构
数据结构 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
Struct |
type Person struct { Name string } |
O(1) |
O(1) |
定义新数据类型 Person 。 |
|
p := Person{Name: "Alice"} |
O(1) |
O(1) |
创建 Person 的新实例。 |
|
p.Name |
O(1) |
O(1) |
访问或修改结构体中的字段。 |
|
Embedded Structs |
O(1) |
O(1) |
结构体可以包含其他结构体。 |
|
Tags |
O(1) |
O(1) |
结构字段可以有元数据标记。 |
字符串和迭代器操作
函数 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
Length |
len(s) |
O(1) |
O(1) |
返回字符串长度。 |
Concatenation |
s = s1 + s2 |
O(n) |
O(n) |
连接两个字符串。 |
Substring |
substr = s[start:end] |
O(1) |
O(1) |
从字符串中获取子串。 |
Contains |
strings.Contains(s, substr) |
O(n) |
O(1) |
检查 s 是否包含子串 substr 。 |
Split |
strings.Split(s, sep) |
O(n) |
O(n) |
用 sep 切割字符串。 |
Replace |
strings.Replace(s, old, new, n) |
O(n) |
O(n) |
将‘ old ’替换为‘ new ’。 |
ToUpper |
strings.ToUpper(s) |
O(n) |
O(n) |
将字符串转换为大写。 |
TrimSpace |
strings.TrimSpace(s) |
O(n) |
O(n) |
去除字符串前后的空白。 |
Index |
strings.Index(s, substr) |
O(n) |
O(1) |
返回 substr 第一次出现的索引。 |
Join |
strings.Join(slice, sep) |
O(n) |
O(n) |
将切片的元素连接成单个字符串。 |
迭代
循环类型 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
For Loop |
for i := 0; i < n; i++ {} |
O(n) |
O(1) |
从 0 到 n-1 的标准循环。 |
For Range |
for index, value := range collection {} |
O(n) |
O(1) |
迭代集合中的元素。 |
Infinite Loop |
for { /* code */ } |
看情况 |
O(1) |
创建无限循环,直到满足中断条件。 |
Goroutine
操作 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
Start |
go functionName() |
O(1) |
O(1) |
启动一个执行 functionName 的 goroutine。 |
通道(Channel)
操作 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
Create |
ch := make(chan T) |
O(1) |
O(1) |
创建类型为 T 的非缓冲通道。 |
Buffered |
ch := make(chan T, capacity) |
O(1) |
O(n) |
创建特定容量的缓冲通道。 |
Send |
ch <- value |
O(1) |
O(1) |
向通道发送值。 |
Receive |
value := <-ch |
O(1) |
O(1) |
从通道接收值。 |
Close |
close(ch) |
O(1) |
O(1) |
关闭通道。 |
Select |
select { case ... } |
O(1) per case |
O(1) |
等待多通道操作。 |
Default Case |
default: |
O(1) |
O(1) |
当没有其他事件发生时执行。 |
同步原语
原语 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
WaitGroup |
var wg sync.WaitGroup |
O(1) |
O(1) |
同步多个 goroutine。 |
|
wg.Add(delta) |
O(1) |
O(1) |
向WaitGroup计数器增加 delta 。 |
|
wg.Done() |
O(1) |
O(1) |
WaitGroup计数器减1。 |
|
wg.Wait() |
O(1) |
O(1) |
阻塞直到WaitGroup计数器为零。 |
Mutex |
var mu sync.Mutex |
O(1) |
O(1) |
确保临界区互斥。 |
|
mu.Lock() |
O(1) |
O(1) |
锁定互斥对象。 |
|
mu.Unlock() |
O(1) |
O(1) |
解锁互斥对象。 |
RWMutex |
var rwmu sync.RWMutex |
O(1) |
O(1) |
允许多读单写。 |
|
rwmu.RLock() |
O(1) |
O(1) |
锁定读互斥锁。 |
|
rwmu.RUnlock() |
O(1) |
O(1) |
解锁读互斥锁。 |
|
rwmu.Lock() |
O(1) |
O(1) |
锁定写互斥锁。 |
|
rwmu.Unlock() |
O(1) |
O(1) |
解锁写互斥锁。 |
Once |
var once sync.Once |
O(1) |
O(1) |
确保函数只被调用一次。 |
|
once.Do(func()) |
O(1) |
O(1) |
如果尚未完成,则调用该函数。 |
Cond |
var cond *sync.Cond |
O(1) |
O(1) |
实现条件变量。 |
|
cond.Wait() |
O(1) |
O(1) |
等待信号。 |
|
cond.Signal() |
O(1) |
O(1) |
唤醒一个等待的 goroutine。 |
|
cond.Broadcast() |
O(1) |
O(1) |
唤醒所有等待的 goroutine。 |
文件 I/O 和系统操作
操作 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
Open File |
file, err := os.Open(filename) |
O(1)* |
O(1) |
打开准备读取的文件。 |
Create File |
file, err := os.Create(filename) |
O(1)* |
O(1) |
创建或打开用于写入的文件。 |
Read |
n, err := file.Read(buf) |
O(n)* |
O(1) |
将数据读取到缓冲区 buf 。 |
Write |
n, err := file.Write(data) |
O(n)* |
O(1) |
将数据从 data 写入文件。 |
Close |
err := file.Close() |
O(1)* |
O(1) |
关闭文件。 |
Stat |
info, err := os.Stat(filename) |
O(1)* |
O(1) |
获取文件信息。 |
Remove |
err := os.Remove(filename) |
O(1)* |
O(1) |
删除文件。 |
错误处理和调试
操作 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
Create |
err := errors.New("message") |
O(1) |
O(1) |
创建带描述消息的新错误。 |
Return |
return value, err |
O(1) |
O(1) |
返回错误。 |
Check |
if err != nil { /* handle */ } |
O(1) |
O(1) |
检查是否发生错误。 |
Wrap Error |
fmt.Errorf("... %w", err) |
O(1) |
O(1) |
用附加上下文包装现有错误。 |
Unwrap |
errors.Unwrap(err) |
O(1) |
O(1) |
检索链中的下一个错误。 |
Is |
errors.Is(err, targetErr) |
O(n) |
O(1) |
检查错误是否与目标错误匹配。 |
As |
errors.As(err, &targetType) |
O(n) |
O(1) |
检查是否可以将错误强制转换为特定类型。 |
调试
工具 |
语法 |
描述 |
fmt.Printf |
fmt.Printf("Value: %v", value) |
为调试目的格式化并打印变量。 |
log.Fatal |
log.Fatal(err) |
记录错误消息并退出。 |
panic |
panic("message") |
停止执行并打印堆栈跟踪。 |
recover |
recover() |
从延迟函数的panic中恢复。 |
反射
操作 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
Get Type |
t := reflect.TypeOf(x) |
O(1) |
O(1) |
获取 x 的类型。 |
Get Value |
v := reflect.ValueOf(x) |
O(1) |
O(1) |
获取 x 的值。 |
Set Value |
v.Set(newValue) |
O(1) |
O(1) |
设置新值; v 必须是可设置的。 |
Kind |
k := t.Kind() |
O(1) |
O(1) |
获取类型种类 (struct , int , 等等)。 |
NumField |
n := t.NumField() |
O(1) |
O(1) |
获取结构中字段的数目。 |
Field |
f := v.Field(i) |
O(1) |
O(1) |
通过索引访问字段。 |
同步软件包
原语 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
sync.Map |
var m sync.Map |
O(1) |
O(n) |
支持并发安全的映射。 |
|
m.Store(key, value) |
O(1) |
O(1) |
保存键值对。 |
|
value, ok := m.Load(key) |
O(1) |
O(1) |
通过键获取值。 |
|
m.Delete(key) |
O(1) |
O(1) |
删除键值对。 |
|
m.Range(func(k, v interface{}) bool) |
O(n) |
O(1) |
迭代所有键值对。 |
sync.Pool |
var p = sync.Pool{New: func() interface{} {}} |
O(1) |
O(n) |
临时对象池。 |
|
p.Get() |
O(1) |
O(1) |
从池中检索对象。 |
|
p.Put(x) |
O(1) |
O(1) |
返回对象到对象池。 |
上下文软件包
操作 |
语法 |
描述 |
Background |
ctx := context.Background() |
返回空上下文。 |
WithCancel |
ctx, cancel := context.WithCancel(parentCtx) |
创建一个可取消的上下文。 |
WithTimeout |
ctx, cancel := context.WithTimeout(parentCtx, duration) |
设置超时时间。 |
WithValue |
ctx := context.WithValue(parentCtx, key, value) |
向上下文添加一个值。 |
Done |
<-ctx.Done() |
等待上下文被取消或超时。 |
Err |
err := ctx.Err() |
返回错误,解释上下文被取消的原因。 |
JSON 编解码
操作 |
语法 |
时间复杂度 |
空间复杂度 |
描述 |
Marshal |
data, err := json.Marshal(v) |
O(n) |
O(n) |
将 Go 值 v 转成 JSON。 |
Unmarshal |
err := json.Unmarshal(data, &v) |
O(n) |
O(n) |
将JSON数据解析为 Go 值 v . |
Decoder |
dec := json.NewDecoder(r) |
O(1) |
O(1) |
从 io.Reader 创建JSON解码器。 |
Encoder |
enc := json.NewEncoder(w) |
O(1) |
O(1) |
创建一个写入 io.Writer 的JSON编码器。 |
从基础数据结构、并发性到高级系统操作和错误处理,本手册是深入探索 Golang 的入口,但真正的探索始于你自己的项目和贡献。
你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!
本文由mdnice多平台发布