# README
高级Goland学习代码 github.com/Danny5487401/go_advanced_code
- 目录
- 必备知识:
- 第一章 I/O
- 第二章 协程Goroutine
- 第三章 通道Channel
- 第四章 interface 和反射
- 第五章 切片和数组
- 第六章 指针
- 第七章 系统调用
- 第八章 defer函数及汇编语言理解
- 第九章 设计模式-OOP七大准则
- 第十章 函数式编程
- 第十一章 汇编理解go语言底层源码(AMD芯片运行代码)
- 第十二章 net 网络--涉及性能指标,协议栈统计,套接字信息
- 第十三章 CGO调用C语言
- 第十四章 Context上下文-源码分析涉及父类EmptyCtx
- 第十五章 接口嵌套编程
- 第十六章 并发编程
- 第十七章 数据结构及算法
- 第十八章 错误跟踪 error 和 panic
- 第十九章 nil预定义标识
- 第二十章 for-range 源码分析
- 第二十一章 time标准包源码分析
- 第二十二章 数据驱动模板源码分析-->kratos工具
- 第二十三章 调试内部对象
- 第二十四章 命令行参数解析
- 第二十四章 Flag命令行参数及源码分析
- 第二十五章 结构体类型方法
- 第二十六章 strconv字符串和数值型转换源码分析
- 第二十七章 Prometheus
- 第二十八章 如何进行测试
- 第二十九章 module包管理
- 第三十章 内存管理
- 第三十一章 go开发套件
- 第三十二章 Generic 泛型
- 第三十三章 makefile 使用
- 第三十四章 regexp 正则表达式 Regular Expression
- 第三十五章 编码 Unicode
目录
Note: 目录同级为 代码展示,推荐在 Goland 2022.2.1 版本以上运行,推荐 GoVersion: 1.21
必备知识:
第一章 I/O
- 1 os 操作系统模块
- 1.1 os中 FileInfo 文件属性
- 1.2 os文件操作
- 1.3 io包底层 Reader 和 Writer 接口
- 1.3.1 os,bytes,strings包
- 1.4 io断点续传
- 1.5 FilePath包
- 2 bufio 缓存读写
- 3 Go 1.16 io.FS: Go 理解的文件系统
- 4 io.Pipe 对比使用 json.NewDecoder 流式解析 http body中间数据-->在 minio 下载数据实现
第二章 协程Goroutine
第三章 通道Channel
- 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 模型中应用
第四章 interface 和反射
- 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和=复制
- 8 append 切片常用考题
第六章 指针
- 1 指针类型转换及修改值
- 2 指针分类及unsafe包使用
- 3 获取并修改结构体私有变量值
- 4 切片与字符串零拷贝互转(指针和反射方式)
- 5 结构体的内存对齐规则
- 5.1 结构体排序优化内存占用
- 5.2 空 struct{} 结构体使用
- 空结构体作为第一个元素
- 空结构体作为最后一个元素
第七章 系统调用
- 1 基于 kqueue event loop 的 TCP server(涉及各种linux系统调用
- 2 使用 strace 工具追踪系统调用-->使用 linux amd64 环境
- 3 exec 执行命令
第八章 defer函数及汇编语言理解
第九章 设计模式-OOP七大准则
- 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 一等公民案例
- 网络管理中需求
- 网络管理中三种处理对比
第十一章 汇编理解go语言底层源码(AMD芯片运行代码)
第十二章 net 网络--涉及性能指标,协议栈统计,套接字信息
-
1 http 服务端高级封装演变: ServeHTTP 是 HTTP 服务器响应客户端的请求接口
-
2 http 客户端高级封装演变
-
9 HTTPS, SAN, SLS, TLS及源码分析握手过程
- 9.1 https 单向认证
- 9.2 https 双向认证
第十三章 CGO调用C语言
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自动获取头文件和链接库的方法
第十四章 Context上下文-源码分析涉及父类EmptyCtx
- 1 Context使用背景
- 2 WithCancel 使用
- 3 WithDeadline 使用
- 4 WithValue 使用
- 5 WithTimeout 对 WithDeadline 封装的使用
- 6 Go1.21 增加取消原因以及回调函数的增添
第十五章 接口嵌套编程
第十六章 并发编程
第十七章 数据结构及算法
- 1 queue 双端单向队列
- 2 加解密
- 3 随机算法(伪随机和真随机)
- 4 排序算法分类及图解(sort包源码分析)
- 4.1 sort包使用
- 不同结构体切片根据反射reflect实现自定义排序
- map根据key实现排序
- sort.Search 根据排序切片找索引
- 4.1 sort包使用
- 5 container
- 6 certificate 证书-->openssl 使用
- 7 Base64编码解析
- 8 trie前缀树
- 9 Golang底层数据结构-涉及数值类型占用的bit
- 10 copy_on_write 写入时复制-->golang官方库btree
第十八章 错误跟踪 error 和 panic
- 0 错误(err)和异常(exception)区别及处理方式
- 1 自定义错误类型打印错误栈
- 2 扩展包pkg.errors
- 3 Gin的错误recover分析(panic和recover源码分析)
- 4 生成errCode错误码及信息
- 5 error如何正确比较
- 6 收集多个errors-->go-multierror实现
- 7 错误链
第十九章 nil预定义标识
- 1 不同类型为nil时的地址和size大小
- 2 不同类型与nil的比较
- 3 不同类型nil时的特点
第二十章 for-range 源码分析
- 1 遍历数组,切片,结构体数组
- 2 正确遍历 Goroutine 捕获变量 (解析协程启动时间) 及在 GO 1.21 使用 EXPERIMENT=loopvar重新定义循环
- 3 遍历 Map(增加或删除map元素时)
第二十一章 time标准包源码分析
第二十二章 数据驱动模板源码分析-->kratos工具
第二十三章 调试内部对象
第二十四章 命令行参数解析
第二十四章 Flag命令行参数及源码分析
第二十五章 结构体类型方法
第二十六章 strconv字符串和数值型转换源码分析
第二十七章 Prometheus
第二十八章 如何进行测试
- 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)
第二十九章 module包管理
- 1 go-module 实践篇
- 模块缓存
- GOPROXY
- 2 go-module原理篇
- Minimal Version Selection 最小版本选择算法
- 3 go1.17 module依赖图修剪及延迟 module 加载
第三十章 内存管理
- 1 Linux内存及Go内存结构管理
- 2 GC垃圾回收机制
- 2.1 下次GC的时机
- 2.2 删除Map元素时通过 runtime.MemStats 查看GC回收流程
- 2.3 内存对象中有指针与无指针的GC对比,检测内存对象中的指针
- 3 逃逸分析
- 4 内存模型:happened before
第三十一章 go开发套件
- 1 build == compile编译 + link链接,附Go包导入路径讲解
- 2 Go tool 自带工具
- 3 Golang程序调试工具: delve-->调试器分类及实现
- 4 ast 抽象语法树
- 5 go1.21 toolchain 规则
第三十二章 Generic 泛型
- 1 泛型在算法上的基本使用
- 2 ~int 底层类型及 Go1.18 接口分为两种类型: 基本接口(Basic interface) 和 一般接口(General interface)
- 3 泛型性能测试
- 4 comparable 要求结构体中每个成员变量都是可比较
- 5 泛型工具库-->samber/lo
第三十三章 makefile 使用
第三十四章 regexp 正则表达式 Regular Expression
第三十五章 编码 Unicode
# Packages
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author