- 目录
- 必备知识:
- 第一章 I/O
- 第二章 协程Goroutine
- 第三章 通道Channel
- 第四章 interface 和反射
- 第五章 切片和数组
- 第六章 指针
- 第七章 系统调用
- 第八章 defer函数及汇编语言理解
- 第九章 设计模式-OOP七大准则
- 第十章 函数式编程
- 第十一章 汇编理解go语言底层源码(AMD芯片运行代码)
- 第十二章 net 网络--涉及性能指标,协议栈统计,套接字信息
- 第十三章 CGO调用C语言
- 第十四章 Context上下文-源码分析涉及父类EmptyCtx
- 第十五章 接口嵌套编程
- 第十六章 并发编程
- 第十七章 数据结构及算法
- 第十八章 错误跟踪 error 和 panic
- 第十九章 nil 预定义标识
- 第二十章 for-range 源码分析
- 第二十一章 time标准包源码分析
- 第二十二章 数据驱动模板源码分析-->kratos工具
- 第二十三章 调试内部对象
- 第二十四章 命令行参数解析
- 第二十四章 Flag命令行参数及源码分析
- 第二十五章 结构体类型方法
- 第二十六章 strconv 字符串和数值型转换源码分析
- 第二十七章 image 图片处理
- 第二十八章 如何进行测试
- 第二十九章 module包管理
- 第三十章 内存管理
- 第三十一章 go开发套件
- 第三十二章 Generic 泛型
- 第三十三章 makefile 使用
- 第三十四章 regexp 正则表达式 Regular Expression
- 第三十五章 编码 Unicode
Note: 目录同级为 代码展示,推荐在 Goland 版本 2022.2.1+ 运行,推荐 GoVersion: 1.21+
- 1 os 操作系统模块
- 1.1 os中 FileInfo 文件属性
- 1.2 os文件操作
- 1.3 io包底层 Reader 和 Writer 接口
- 1.3.1 os,bytes,strings包
- 1.4 io 断点续传及网络支持
- seeker 偏移量
- http header: 客户端Range,Content-Range
- 1.5 FilePath包
- 1.5.1 walkPath遍历目录及文件(匹配文件名)
- 2 bufio 缓存读写
- 3 Go 1.16 io.FS: Go 理解的文件系统
- 4 io.Pipe 对比使用 json.NewDecoder 流式解析 http body中间数据-->在 minio 下载数据实现
- 1 线程模型分类及Goroutine切换原则(GPM模型)
- 2 runtime运行时模块
- 3 多 goroutine 的缓存一致性(涉及cpu伪共享)
- 4 线程池(池化技术)
- 5 channel导致goroutine泄漏分析及处理
- 6 Go routine 编排框架:oklog/run 包: 将各个组件作为一个整体运行,并有序地结束-->vault 应用
- 1 Channel内部结构及源码分析(含PPT分析)
- 1.1 channel 初始化及引用传递
- 1.2 使用 channel 实现 goroutine 父子通信
- 1.3 死锁:range 未关闭的 channel
- 1.4 通道遍历:for range 语法
- 1.5 优雅关闭 channel 与粗暴关闭 channel
- 1.5.1 SPMC(Single-Producer Multi-Consumer 1 个 sender,N 个 receiver): 发送者通过关闭数据通道说 「不要再发送了」
- 1.5.2 SPSC(Single-Producer Single-Consumer 1 个 sender,1 个 receiver):发送者通过关闭数据通道说 「不要再发送了」
- 1.5.3 MPSC(Multi-Producer Single-Consumer N 个 sender,1 个 receiver): 接收者通过关闭一个信号通道说 「请不要再发送数据了」
- 1.5.4 MPMC(Multi-Producer Multi-Consumer N 个 sender,M 个 receiver): 任意一个通过通知一个主持人去关闭一个信号通道说「让我们结束这场游戏吧」
- 1.6 单向与双向通道
- 1.7 读取 nil channel 实现阻塞
- 1.8 使用 channel 传递 channel
- 1.9 循环读取关闭的通道值是否阻塞
- 1.10 select 实现 channel 优先级-->k8s中Node 的更新操作优先于 Pod 的更新
- 2 channel应用:TimerChan模块源码分析及使用陷阱
- 3 Select 多路复用
- 4 基于消息传递并发模型:Actor模型和CSP模型-->Golang 在 CSP 模型中应用
- 1 interface 分类:eface 和 iface, 及两者之间关系转换
- 2 反射
- 2.0 常见需求: 不能预先确定参数类型,需要动态的执行不同参数类型行为
- 2.1 反射三大定律
- 2.2 四种类型转换:断言、强制、显式、隐式
- 2.2.1 断言的类型T是一个具体类型 或则 接口类型
- 2.2.2 类型断言性能分析
- 空接口类型直接类型断言具体的类型
- 空接口类型使用TypeSwitch 只有部分类型
- 空接口类型使用TypeSwitch 所有类型
- 直接使用类型转换
- 非空接口类型判断一个类型是否实现了该接口 12个方法
- 直接调用方法
- 2.3 动态创建类型
- 2.4 通过 reflect 基本函数修改值,调用结构体方法,调用普通函数
- 2.5 反射性能优化演变案例
- 2.6 通过reflect.DeepEqual进行深度比较引用类型
- 底层类型相同,相应的值也相同,两个自定义类型*是否“深度”相等
- 一个nil值的map和非nil值但是空的map*是否“深度”相等
- 带有环的数据对比*是否“深度”相等
- 2.7 reflect.implements 判断 struct 是否实现某接口
- 2.8 go-cmp-->reflect.DeepEqual 的替代品
- 1 参数传递
- 2 切片传递的疑惑
- 3 带索引初始化数组和切片
- 4 底层数据结构
- 5 nil 切片和 empty 切片
- 6 扩容策略
- 7 不同类型的切片间互转
- 8 切片复制方式对比: copy和=复制
- 9 append 切片常用考题
- 10 并发访问 slice 如何做到优雅和安全
- 11 go1.21 切片泛型库
- 1 指针类型转换及修改值
- 2 指针分类及unsafe包使用
- 3 获取并修改结构体私有变量值
- 4 []byte 切片 与 string 字符串实现零拷贝互转(指针和反射方式)
- 5 结构体的内存对齐规则
- 5.1 结构体排序优化内存占用
- 5.2 空 struct{} 结构体使用
- 空结构体作为第一个元素
- 空结构体作为最后一个元素
- 1 创建型模式 Creational Patterns
- 2 结构型模式 Structural Patterns
- 3 行为型模式 Behavioral Patterns
- 3.1 访问者模式(Visitor Design Pattern)-->k8s中kubectl实现
- 3.2 迭代器(Iterator Design Pattern)-->标准库container/ring中实现
- 3.3 状态模式(State Design Pattern)
- 3.4 责任链模式(Chain Of Responsibility Design Pattern)-->gin 中间件中使用
- 3.5 模版模式(Template Method Design Pattern)
- 3.6 策略模式(Strategy Method Design Pattern)-->if-else的另类写法(内部算法封装)
- 3.7 解释器模式(Interpreter Design Pattern)
- 3.8 命令模式(Command Design Pattern)-->go-redis中实现
- 3.9 备忘录模式(Memento Design Pattern)
- 3.10 观察者模式(Observer Design Pattern)-->官方Signal包及etcd的watch机制
- 3.11 中介者模式(Mediator Design Pattern)
- 4 函数选项:成例模式-->在日志库zap中实现
- 4.1 未使用函数选项初始化结构体的现状
- 4.2 区分必填项和选项
- 4.3 带参数的选项模式
- 5 插件式编程-->grpc中实现
- 6 同步模式(sync同步原语以及扩展原语)
- 6.1 waitGroup同步等待组对象
- 6.2 使用互斥锁(sync.Mutex)实现读写功能和直接使用读写锁(sync.RWMutex)性能对比
- 6.3 Once源码分析
- 6.4 并发安全的sync.Map与sync.RWMutex封装的map对比及源码分析
- 6.5 Pool对象池模式( 非连接池)-->官方包对象池fmt
- 6.6 Cond 条件变量协调想要访问共享资源的goroutine及 NoCopy机制-->熔断框架 hystrix-go 优秀实现
- 6.7 atomic原子操作源码分析-->zerolog源码中实现
- 6.8 ErrorGroup获取协程中error
- 6.9 信号量 Semaphore-->mutex是二进制信号量 binary semaphore
- 6.10 SingleFlight避免缓存击穿
- 1 函数应用
- 2 高级函数filter,map,reduce
- 2.1 简单案例理解 filter,map,reduce
- 2.2 interface{} + reflect 实现泛型->Go1.18之前
- 2.3 go-zero框架实现 map-reduce
- 2.4 RXGo基于pipelines实现ReactiveX 编程模型
- 3 一等公民案例
- 网络管理中需求
- 网络管理中三种处理对比
-
1 http 服务端高级封装演变: ServeHTTP 是 HTTP 服务器响应客户端的请求接口
-
2 http 客户端高级封装演变
-
9 HTTPS, SAN, SLS, TLS及源码分析握手过程
- 9.1 https 单向认证
- 9.2 https 双向认证
Note: 内部c代码需要自己编译成对应本地 静态库 或则 动态库,可参考C基本知识
- 1 Go调用自定义C函数-未模块化
- 2 Go调用自定义C函数-模块化
- 3 Go重写C定义函数
- 4 cgo错误用法:引入其他包的变量
- 5 #Cgo语句
- 6 Go获取C函数的errno
- 7 C的void返回
- 8 Go调用模块化C++库
- 9 调用静态C库
- 10 调用动态C库
- 11 Golang使用pkg-config自动获取头文件和链接库的方法
- 1 Context使用背景
- 2 WithCancel 使用
- 3 WithDeadline 使用
- 4 WithValue 使用
- 5 WithTimeout 对 WithDeadline 封装的使用
- 6 Go1.21 增加取消原因以及回调函数的增添
- 1 queue 双端单向队列
- 2 加解密
- 3 随机算法(伪随机和真随机)
- 4 排序算法分类及图解(sort包源码分析)
- 4.1 sort 排序
- 不同结构体切片根据反射reflect实现自定义排序: sort.Sort 接口实现
- 相同结构体切片排序: sort.Slice
- map根据key实现排序: sort.Strings
- int 类型切片排序: sort.IntSlice
- 4.2 sort.Search 二分查找: 根据排序切片找索引
- 4.1 sort 排序
- 5 container
- 6 certificate 证书-->openssl 使用
- 7 Base64编码解析
- 8 trie前缀树
- 9 Golang底层数据结构-涉及数值类型占用的bit
- 10 copy_on_write 写入时复制-->golang官方库btree
- 0 错误(err)和异常(exception)区别及处理方式
- 1 自定义错误类型打印错误栈
- 2 扩展包pkg.errors
- 3 Gin的错误recover分析(panic和recover源码分析)
- 4 生成errCode错误码及信息
- 5 error如何正确比较
- 6 收集多个errors-->go-multierror实现
- 7 错误链
- 8 debug.SetCrashOutput -->go 1.23 允许设置未被捕获的错误、异常的日志写入
- 1 pointer, channel, func, interface, map, or slice type 为nil时的地址和size大小
- 2 不同类型与nil的比较
- 3 不同类型 nil 时的特点
- 1 遍历数组,切片,结构体数组
- 2 正确遍历 Goroutine 捕获变量 (解析协程启动时间) 及在 GO 1.21 使用 EXPERIMENT=loopvar重新定义循环
- 3 遍历 Map(增加或删除map元素时)
- 1 testing
- 1.1 sub 测试并发
- 1.2 testing.M 将测试交给TestMain调度
- 1.3 testing.F 模糊测试
- 2 go-mock接口测试
- 3 web 测试
- 4 数据库测试
- 5 测试框架 ginkgo-->k8s 使用
- 6 gomonkey 打桩测试(暂不支持arm)
- 7 测试框架 goconvey
- 8 测试框架testify-->gin 使用)
- 1 go-module 实践篇
- 模块缓存
- GOPROXY
- 2 go-module 原理篇
- Minimal Version Selection 最小版本选择算法
- 3 go1.16 retract 撤回版本
- 4 go1.17 module 依赖图修剪及延迟 module 加载
- 5 go1.18 workspace 工作区模式-->k8s 使用
- 1 Linux内存及Go内存结构管理
- 2 GC垃圾回收机制
- 2.1 下次GC的时机
- 2.2 删除Map元素时通过 runtime.MemStats 查看GC回收流程
- 2.3 内存对象中有指针与无指针的GC对比,检测内存对象中的指针
- 3 逃逸分析
- 4 内存模型:happened before
- 1 build == compile编译 + link链接,附Go包导入路径讲解
- 2 Go tool 自带工具
- 3 Golang程序调试工具: delve-->调试器分类及实现
- 4 ast 抽象语法树
- 5 go1.21 toolchain 规则