*本文提供了一份详尽的 Golang速查表格,涵盖了数据结构、控制流、错误处理、反思等多个方面的语法和功能,以帮助开发者高效使用 Golang。原文:[Go Ultimate: The ultimate go cheatsheet you’ll ever need
](https://medium.com/@gopherine/go-ultimate-the-ultimate-go-che...)*

说实话,要记住多种不同编程语言的语法和功能确实很让人头疼。我就曾经在使用不同语言的过程中,发现自己忘记了 Go 的某个可以让代码更简洁、高效的功能。因此我决定为 Go 编写这份小册子,帮助那些想深入了解 Go 强大功能的开发人员,让他们不用一直琢磨:"等等,我该怎么做?"

数组和切片操作

Go 的数组和切片是处理集合的基本数据结构:

数据结构语法时间复杂度空间复杂度描述
Arrayvar arr [n]TO(1)O(n)声明一个固定大小为 n、类型为 T 的数组。
arr[index]O(1)O(1)访问指定索引处的元素。
arr[index] = valueO(1)O(1)更新指定索引处的元素。
切片
数据结构语法时间复杂度空间复杂度描述
Sliceslice := 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 和结构操作
数据结构语法时间复杂度空间复杂度描述
Mapm := 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)返回映射中键值对的个数。
结构
数据结构语法时间复杂度空间复杂度描述
Structtype Person struct { Name string }O(1)O(1)定义新数据类型 Person
p := Person{Name: "Alice"}O(1)O(1)创建 Person 的新实例。
p.NameO(1)O(1)访问或修改结构体中的字段。
Embedded StructsO(1)O(1)结构体可以包含其他结构体。
TagsO(1)O(1)结构字段可以有元数据标记。
字符串和迭代器操作
函数语法时间复杂度空间复杂度描述
Lengthlen(s)O(1)O(1)返回字符串长度。
Concatenations = s1 + s2O(n)O(n)连接两个字符串。
Substringsubstr = s[start:end]O(1)O(1)从字符串中获取子串。
Containsstrings.Contains(s, substr)O(n)O(1)检查 s 是否包含子串 substr
Splitstrings.Split(s, sep)O(n)O(n)sep 切割字符串。
Replacestrings.Replace(s, old, new, n)O(n)O(n)将‘ old ’替换为‘ new ’。
ToUpperstrings.ToUpper(s)O(n)O(n)将字符串转换为大写。
TrimSpacestrings.TrimSpace(s)O(n)O(n)去除字符串前后的空白。
Indexstrings.Index(s, substr)O(n)O(1)返回 substr 第一次出现的索引。
Joinstrings.Join(slice, sep)O(n)O(n)将切片的元素连接成单个字符串。
迭代
循环类型语法时间复杂度空间复杂度描述
For Loopfor i := 0; i < n; i++ {}O(n)O(1)0n-1 的标准循环。
For Rangefor index, value := range collection {}O(n)O(1)迭代集合中的元素。
Infinite Loopfor { /* code */ }看情况O(1)创建无限循环,直到满足中断条件。
Goroutine
操作语法时间复杂度空间复杂度描述
Startgo functionName()O(1)O(1)启动一个执行 functionName 的 goroutine。
通道(Channel)
操作语法时间复杂度空间复杂度描述
Createch := make(chan T)O(1)O(1)创建类型为 T 的非缓冲通道。
Bufferedch := make(chan T, capacity)O(1)O(n)创建特定容量的缓冲通道。
Sendch <- valueO(1)O(1)向通道发送值。
Receivevalue := <-chO(1)O(1)从通道接收值。
Closeclose(ch)O(1)O(1)关闭通道。
Selectselect { case ... }O(1) per caseO(1)等待多通道操作。
Default Casedefault:O(1)O(1)当没有其他事件发生时执行。
同步原语
原语语法时间复杂度空间复杂度描述
WaitGroupvar wg sync.WaitGroupO(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计数器为零。
Mutexvar mu sync.MutexO(1)O(1)确保临界区互斥。
mu.Lock()O(1)O(1)锁定互斥对象。
mu.Unlock()O(1)O(1)解锁互斥对象。
RWMutexvar rwmu sync.RWMutexO(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)解锁写互斥锁。
Oncevar once sync.OnceO(1)O(1)确保函数只被调用一次。
once.Do(func())O(1)O(1)如果尚未完成,则调用该函数。
Condvar cond *sync.CondO(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 Filefile, err := os.Open(filename)O(1)*O(1)打开准备读取的文件。
Create Filefile, err := os.Create(filename)O(1)*O(1)创建或打开用于写入的文件。
Readn, err := file.Read(buf)O(n)*O(1)将数据读取到缓冲区 buf
Writen, err := file.Write(data)O(n)*O(1)将数据从 data 写入文件。
Closeerr := file.Close()O(1)*O(1)关闭文件。
Statinfo, err := os.Stat(filename)O(1)*O(1)获取文件信息。
Removeerr := os.Remove(filename)O(1)*O(1)删除文件。
错误处理和调试
操作语法时间复杂度空间复杂度描述
Createerr := errors.New("message")O(1)O(1)创建带描述消息的新错误。
Returnreturn value, errO(1)O(1)返回错误。
Checkif err != nil { /* handle */ }O(1)O(1)检查是否发生错误。
Wrap Errorfmt.Errorf("... %w", err)O(1)O(1)用附加上下文包装现有错误。
Unwraperrors.Unwrap(err)O(1)O(1)检索链中的下一个错误。
Iserrors.Is(err, targetErr)O(n)O(1)检查错误是否与目标错误匹配。
Aserrors.As(err, &targetType)O(n)O(1)检查是否可以将错误强制转换为特定类型。
调试
工具语法描述
fmt.Printffmt.Printf("Value: %v", value)为调试目的格式化并打印变量。
log.Fatallog.Fatal(err)记录错误消息并退出。
panicpanic("message")停止执行并打印堆栈跟踪。
recoverrecover()从延迟函数的panic中恢复。
反射
操作语法时间复杂度空间复杂度描述
Get Typet := reflect.TypeOf(x)O(1)O(1)获取 x 的类型。
Get Valuev := reflect.ValueOf(x)O(1)O(1)获取 x 的值。
Set Valuev.Set(newValue)O(1)O(1)设置新值; v 必须是可设置的。
Kindk := t.Kind()O(1)O(1)获取类型种类 (struct, int, 等等)。
NumFieldn := t.NumField()O(1)O(1)获取结构中字段的数目。
Fieldf := v.Field(i)O(1)O(1)通过索引访问字段。
同步软件包
原语语法时间复杂度空间复杂度描述
sync.Mapvar m sync.MapO(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.Poolvar p = sync.Pool{New: func() interface{} {}}O(1)O(n)临时对象池。
p.Get()O(1)O(1)从池中检索对象。
p.Put(x)O(1)O(1)返回对象到对象池。
上下文软件包
操作语法描述
Backgroundctx := context.Background()返回空上下文。
WithCancelctx, cancel := context.WithCancel(parentCtx)创建一个可取消的上下文。
WithTimeoutctx, cancel := context.WithTimeout(parentCtx, duration)设置超时时间。
WithValuectx := context.WithValue(parentCtx, key, value)向上下文添加一个值。
Done<-ctx.Done()等待上下文被取消或超时。
Errerr := ctx.Err()返回错误,解释上下文被取消的原因。
JSON 编解码
操作语法时间复杂度空间复杂度描述
Marshaldata, err := json.Marshal(v)O(n)O(n)将 Go 值 v 转成 JSON。
Unmarshalerr := json.Unmarshal(data, &v)O(n)O(n)将JSON数据解析为 Go 值 v.
Decoderdec := json.NewDecoder(r)O(1)O(1)io.Reader 创建JSON解码器。
Encoderenc := json.NewEncoder(w)O(1)O(1)创建一个写入 io.Writer 的JSON编码器。

从基础数据结构、并发性到高级系统操作和错误处理,本手册是深入探索 Golang 的入口,但真正的探索始于你自己的项目和贡献。


你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

本文由mdnice多平台发布


俞凡
21 声望14 粉丝

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起...