go_advanced_code icon indicating copy to clipboard operation
go_advanced_code copied to clipboard

Go进阶编程学习,be a nicer Gopher

高级Goland学习代码 github.com/Danny5487401/go_advanced_code

Go Report Card GitHub stars GitHub forks Documentation GitHub issues license

高级go编程

  • 目录
    • 必备知识:
    • 第一章 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

必备知识:

  • module包管理
  • golangci 规范并优化代码 + pre-commit工具

第一章 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包
      • 1.5.1 walkPath遍历目录及文件(匹配文件名)
  • 2 bufio 缓存读写
    • 2.1 reader
    • 2.2 writer
  • 3 Go 1.16 io.FS: Go 理解的文件系统
    • go 1.16 前后的文件io对比
  • 4 io.Pipe 对比使用 json.NewDecoder 流式解析 http body中间数据-->在 minio 下载数据实现

第二章 协程Goroutine

  • 1 线程模型分类及Goroutine切换原则(GPM模型)

    • 1.1 trace查看宏观调度流程(Goroutine启动时长)
    • 1.2 使用 go.uber.org/automaxprocs 在容器里设置 GOMAXPROCS 的正确姿势
    • 1.3 runtime.LockOSThread() 将某个goroutine锁定到某个系统线程,这个线程只调度这个goroutine,进而可以被优先调度(相对其他goroutine)-->cni terway 中实现
  • 2 runtime运行时模块

    • 2.1 runtime核心功能及系统信息调用
    • 2.2 Goexit()终止线程: defer 语句仍然执行
    • 2.3 data race 资源竞争一致性问题分析
      • 2.3.1 -race 标志分析问题产生
      • 2.3.2 mutex解决问题
    • 2.4 监控代码性能pprof
      • 2.4.1 标准包runtime/pprof及net/http/pprof使用
      • 2.4.2 第三方包pkg/profile
      • 2.4.3 debug 定位goroutine:添加pprof标签
  • 3 多 goroutine 的缓存一致性(涉及cpu伪共享)

  • 4 线程池(池化技术)

    • 4.1 使用channel实现Goroutine最大数量限制(令牌桶方式)
    • 4.2 百万请求处理案例
    • 4.3 第三方包线程池ants
    • 4.4 标准库连接池database/sql源码分析
      • 4.4.1 连接池Benchmark对比
  • 5 channel导致goroutine泄漏分析及处理

    • 5.1 channel未正常关闭导致goroutine泄漏-->使用 goleak 工具检查
    • 5.2 channel监听避免goroutine泄漏
  • 6 Go routine 编排框架:oklog/run 包: 将各个组件作为一个整体运行,并有序地结束-->vault 应用


第三章 通道Channel

  • 1 Channel内部结构及源码分析(含PPT分析)
    • 1.1 channel 初始化及引用传递
      • 1.1.1 无缓存 channel
      • 1.1.2 有缓冲 channel
      • 1.1.3 chanx: 使用 RingBuffer 实现无限缓存 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模块源码分析及使用陷阱
    • 2.1 reset重新等待被触发
    • 2.2 timerStop使用
    • 2.3 TimerAfter给数据库操作增加超时
  • 3 Select 多路复用
    • 3.1 配合 default 实现不阻塞发送
    • 3.2 多 case 随机选择
  • 4 基于消息传递并发模型:Actor模型和CSP模型-->Golang 在 CSP 模型中应用

第四章 interface 和反射

  • 1 interface 分类:eface 和 iface, 及两者之间关系转换
    • 1.1 汇编分析不含方法eface和带方法iface
    • 1.2 接口值 iface == nil 是指动态类型 iface.tab._type 和动态值 iface.data 都为 nil
    • 1.3 模拟打印出接口 eface 的动态类型 itab 和 data 值
  • 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 的替代品
      • 2.8.1 结构体内嵌指针:与 == 对比进行相等判断
      • 2.8.2 IgnoreUnexported 忽略未导出字段,AllowUnexported 指定某些类型的未导出字段需要比较
      • 2.8.3 切片变量值为 nil 与 长度为 0 的切片相等判断,map 实现元素对比
      • 2.8.4 切片 及 map 相等判断
      • 2.8.5 diff 打印结构体成员区别
      • 2.8.6 自定义Equal方法

第五章 切片和数组

  • 1 参数传递
    • 1,1 值传递-->数组拷贝,数组作为函数参数传递
    • 1.2 引用传递-->数组指针,切片和指针切片传递
    • 1.3 切片和数组作为参数传递性能对比及注意项
  • 2 切片传递的疑惑
    • 2.1 没有足够容量时函数中切片传递的疑惑
    • 2.2 没有足够容量切片传递疑惑揭秘:底层扩容指向的数据变化
    • 2.3 有足够容量时函数中切片传递的疑惑
    • 2.4 有足够容量时函数传递疑惑揭秘: 底层len长度没变
  • 3 带索引初始化数组和切片
  • 4 底层数据结构
    • 4.1 数组数据结构
    • 4.2 切片数据结构及拷贝copy源码分析
    • 4.3 slice 转 array 在版本 1.20 前后变化
  • 5 nil 切片和 empty 切片
    • 5.1 优雅的清空切片,复用内存
  • 6 扩容策略
  • 7 不同类型的切片间互转
  • 8 切片复制方式对比: copy和=复制
  • 8 append 切片常用考题

第六章 指针

  • 1 指针类型转换及修改值
  • 2 指针分类及unsafe包使用
    • 2.1 sizeof获取类型其占用的字节数,unsafe.Offsetof修改结构体私有成员
    • 2.2 指针获取切片长度和容量
    • 2.3 指针获取Map的元素数量
    • 2.4 使用指针来访问数组里的所有元素
  • 3 获取并修改结构体私有变量值
  • 4 切片与字符串零拷贝互转(指针和反射方式)
  • 5 结构体的内存对齐规则
    • 5.1 结构体排序优化内存占用
    • 5.2 空 struct{} 结构体使用
      • 空结构体作为第一个元素
      • 空结构体作为最后一个元素

第七章 系统调用

  • 1 基于 kqueue event loop 的 TCP server(涉及各种linux系统调用
  • 2 使用 strace 工具追踪系统调用-->使用 linux amd64 环境
    • 2.1 syscall.PtraceGetRegs 获取所有寄存器的值
    • 2.2 使用 seccomp 查看 echo hello 的系统调用及次数
  • 3 exec 执行命令

第八章 defer函数及汇编语言理解

  • 1 注册延迟调用机制定义及使用
  • 2 defer陷阱
  • 3 分阶段解析defer函数
  • 4 defer循环性能问题
  • 5 汇编理解defer函数(AMD)

第九章 设计模式-OOP七大准则

  • 1 创建型模式 Creational Patterns
    • 1.1 工厂模式(Factory Design Pattern)
      • 1.1.1 简单工厂模式-->new关键字函数实现简单工厂
      • 1.1.2 工厂方法模式-->k8s中实现
      • 1.1.3 抽象工厂模式
    • 1.2 单例模式(Singleton Design Pattern)-->标准库strings/replace实现
    • 1.3 原型模式(Prototype Design Pattern)-->confluent-kafka中map实现
    • 1.4 建造者模式(Builder Design Pattern)-->xorm,k8s,zap中实现
  • 2 结构型模式 Structural Patterns
    • 2.1 组合模式(Composite Design Pattern)
      • 2.1.1 修改前:使用面向对象处理
      • 2.1.2 修改后:使用组合模式处理
    • 2.2 装饰模式(Decorator Design Pattern)-->grpc源码体现
      • 2.2.1 闭包实现--多个装饰器同时使用
      • 2.2.2 结构体装饰
      • 2.2.3 反射实现--泛型装饰器
    • 2.3 享元模式(Flyweight Design Pattern)-->线程池,缓存思想
    • 2.4 适配器模式(Adapter Design Pattern)
    • 2.5 桥接模式(Bridge Design Pattern)
    • 2.6 门面模式(外观模式Facade Design Pattern)-->在gin中render应用(封装多个子服务)
    • 2.7 代理模式(Proxy Design Pattern)
  • 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 带参数的选项模式
      • 不返回error
      • 返回error
  • 5 插件式编程-->grpc中实现
  • 6 同步模式(sync同步原语以及扩展原语)
    • 6.1 waitGroup同步等待组对象
    • 6.2 使用互斥锁(sync.Mutex)实现读写功能和直接使用读写锁(sync.RWMutex)性能对比
      • 6.2.1 使用互斥锁(sync.Mutex)实现读写功能
      • 6.2.2 直接使用读写锁(sync.RWMutex)实现读写功能
      • Mutex和RWMutex源码分析
    • 6.3 Once源码分析
    • 6.4 并发安全的sync.Map与sync.RWMutex封装的map对比及源码分析
    • 6.5 Pool对象池模式( 非连接池 !)-->官方包对象池fmt
      • 6.5.1 错误使用:未使用newFunc
      • 6.5.2 newFunc与GC前后Get对比
      • 6.5.3 何时使用对象缓存
      • 6.5.4 第三方对象池object pool(bytebufferpool)
    • 6.6 Cond 条件变量协调想要访问共享资源的goroutine及 NoCopy机制-->熔断框架 hystrix-go 优秀实现
    • 6.7 atomic原子操作源码分析-->zerolog源码中实现
      • 6.7.0 Value的load和store
      • 6.7.1 add及补码减
      • 6.7.2 cas算法和自旋锁
      • 6.7.3 load和store用法
      • 6.7.4 swap交换
    • 6.8 ErrorGroup获取协程中error
      • 6.8.1 不带context
      • 6.8.2 带context
    • 6.9 信号量 Semaphore-->mutex是二进制信号量 binary semaphore
    • 6.10 SingleFlight避免缓存击穿
      • 6.10.1 Do方法
      • 6.10.2 DoChan方法

第十章 函数式编程

  • 1 函数应用
    • 1.1 闭包基本使用
    • 1.2 匿名函数应用:回调函数
    • 1.3 函数模版:定义行为
  • 2 高级函数filter,map,reduce
    • 2.1 简单案例理解 filter,map,reduce
    • 2.2 interface{} + reflect 实现泛型->Go1.18之前
      • filter
      • map
      • reduce
    • 2.3 go-zero框架实现 map-reduce
      • 2.3.1 Finish函数:一个应用依托于很多服务,在没有强依赖关系下,优雅地实现并发编排任务
    • 2.4 RXGo基于pipelines实现ReactiveX 编程模型
      • 2.4.1 map,reduce 使用
  • 3 一等公民案例
    • 网络管理中需求
    • 网络管理中三种处理对比
      • 3.1 通过同享内存通信
      • 3.2 通过通信(具体数据)共享内存
      • 3.3 通过通信(函数)共享内存

第十一章 汇编理解go语言底层源码(AMD芯片运行代码)

  • 1 汇编基本指令
  • 2 plan9 手写汇编
    • 2.1 变量var,常量constant
    • 2.2 array数组
    • 2.3 bool类型
    • 2.4 int,int32,uint32类型
    • 2.5 float32,float64类型
    • 2.6 slice切片([]byte)
    • 2.7 引用类型map和channel
    • 2.8 asm 实现 Go 函数申明
      • Go源码中stack操作
    • 2.9 局部变量
    • 2.10 流程控制
    • 2.11 伪寄存器 SP 、伪寄存器 FP 和硬件寄存器 SP关系
    • 2.12 结构体方法
    • 2.13 递归函数
    • 2.14 闭包函数
    • 2.15 两种方式获取GoroutineId
    • 2.16 汇编调用非汇编Go函数

第十二章 net 网络--涉及性能指标,协议栈统计,套接字信息

  • socket 套接字缓冲区

  • tcp 传输控制协议

  • I/O 多路复用及 epoll 在 Golang 工作模型体现

  • http的三个版本知识介绍

  • 1 http 服务端高级封装演变: ServeHTTP 是 HTTP 服务器响应客户端的请求接口

    • 1.1 高级封装:使用DefaultServeMux
    • 1.2 中级封装:使用内置serveMux生成函数
    • 1.3 原始封装:自定义实现serveMux
  • 2 http 客户端高级封装演变

    • request 源码
    • response 源码
    • http.RoundTripper 接口实现源码: 调用方将请求作为参数获取请求对应的响应,并管理连接
    • http.Client 源码
    • 2.1 官方库版(爬虫获取邮箱案例-未封装)
    • 2.2 go-resty(推荐使用)
  • 3 Tcp 实现 Socket 编程 (服务端 netpoll 分析)

    • 客户端
    • 服务端
  • 4 Tcp黏包分析及处理(大小端介绍)

    • 4.1 TCP 粘包问题
    • 4.2 TCP 粘包解决方式
  • 5 fastHttp(源码分析)

    • 5.1 服务端
    • 5.2 客户端
  • 6 优雅退出原理分析-涉及linux信号介绍(go-zero实践)

    • 6.1 信号监听处理
  • 7 URL的解析 Parse,query 数据的转义与反转义

  • 8 使用 alice 优雅编排中间件

    • 5.1 jwt 中间件载体 Symmetric 对称加密->HSA
    • 5.2 jwt 中间件载体 asymmetric 非对称加密(更安全)->RSA
  • 9 HTTPS, SAN, SLS, TLS及源码分析握手过程

    • 9.1 https 单向认证
      • 9.1.1 服务端修改 tls 版本
      • 9.1.2 客户端不校验证书 或则 添加到证书池
    • 9.2 https 双向认证
  • 10 unix domain socket 本地 IPC 进程间通信

  • 11 获取本机内网和外网Ip

  • 12 http2 使用

    • let's encrypt 免费证书 开发server
  • 13 flusher 实现 stream 流式返回

第十三章 CGO调用C语言

cgo在confluent-kafka-go源码使用

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使用背景
    • 1.1 问题:如何通过父进程优雅释放子goroutine资源
    • 1.2 方式一:全局参数方式解决的优缺点
    • 1.3 方式二: 通道channel方式解决的优缺点
    • 1.4 方式三: 最优方式Context
  • 2 WithCancel使用
  • 3 WithDeadline使用
  • 4 WithValue使用
  • 5 WithTimeout对WithDeadline封装的使用

第十五章 接口嵌套编程

  • 1 常见冗余代码写法
  • 2 简单优化
  • 3 更优方式

第十六章 并发编程

  • 1 简单流水线模型
  • 2 FAN-IN和FAN-OUT模型

第十七章 数据结构及算法

  • 1 queue 双端单向队列
    • 1.1 array 数组实现非阻塞 Queue-->没有实现容量限制和容量收缩
    • 1.2 array + channel 实现阻塞队列 Queue
  • 2 加解密
    • 2.1 对称式加密
      • 2.1.1 AES高级加密标准(Advanced Encryption Standard)
        • Cipher FeedBack密码反馈模式
        • Cipher Block Chaining密码分组链接模式
      • 2.1.2 des美国数据加密标准(不推荐)
    • 2.2 哈希算法及其在数字签名中应用(hmac,md5,sha1,sha256)
      • MD 5信息摘要算法(Message-DigestAlgorithm 5)
      • HMAC 哈希运算消息认证码(Hash-based Message Authentication Code)
      • SHA安全散列算法(secure Hash Algorithm)
      • 号称计算速度最快的哈希 xxhash
      • consistant hash 一致性hash
    • 2.3 非对称加密算法 rsa
      • 分段与不分段进行加解密
  • 3 随机算法(伪随机和真随机)
    • 3.1 math_rand使用
    • 3.2 crypto_rand使用
    • 3.3 fastrand 优化使用
  • 4 排序算法分类及图解(sort包源码分析)
    • 4.1 sort包使用
      • 不同结构体切片根据反射reflect实现自定义排序
      • map根据key实现排序
      • sort.Search 根据排序切片找索引
  • 5 container
    • 5.1 heap 最小堆
    • 5.2 list 双向链表
  • 6 certificate 证书-->openssl 使用
    • 6.1 pem(Privacy Enhanced Mail Certificate保密增强邮件协议
      • 6.1.1 生成公私钥的 .pem 文件(公钥使用RSA算法)
      • 6.1.2 解析.pem文件获取公私钥
    • 6.2 x509 库源码
      • 6.2.1 ca 创建根证书并签署终端证书
  • 7 Base64编码解析
  • 8 trie前缀树
  • 9 Golang底层数据结构-涉及数值类型占用的bit
    • 9.1 Map底层结构
      • 9,1,1 根据预期初始大小和 loadfactor负载因子 6.5 计算一个数组的长度的对数B
      • 9,1,2 map的指针优化场景
      • 9.1.3 map 的 Key 类型取值
      • 9.1.4 简单实现 hashMap
    • 9.2 String 底层结构,字符集和字符编码,性能分析及内存泄漏分析
    • 9.3 Struct 底层结构,内存布局,空结构体内存对齐
  • 10 copy_on_write 写入时复制-->golang官方库btree
    • 10.1 使用 RWMutex 缺点
    • 10.2 使用 copy_on_write 优化

第十八章 错误跟踪 error 和 panic

  • 0 错误(err)和异常(exception)区别及处理方式
  • 1 自定义错误类型打印错误栈
  • 2 扩展包pkg.errors
  • 3 Gin的错误recover分析(panic和recover源码分析)
  • 4 生成errCode错误码及信息
    • 4.1 传统方式:命名错误码、状态码的同时,又要map同步写码对应的翻译
    • 4.2 stringer + go generate 自带工具生成errCode错误码及信息->效率高于map映射错误
  • 5 error如何正确比较
  • 6 收集多个errors-->go-multierror实现
  • 7 错误链
    • 7.1 errors.Unwrap 获取错误链中最后面的一个 root error
    • 7.2 errors.As函数 提取 error chain中特定类型的error

第十九章 nil预定义标识

  • 1 不同类型为nil时的地址和size大小
  • 2 不同类型与nil的比较
    • interface为nil时:数据段和类型
    • nil==nil不可以比较
    • ptr,channel,func,map为nil必须地址未分配
    • slice的长度和容量不决定nil
  • 3 不同类型nil时的特点
    • channel为nil时的接收,发送,关闭及select
    • map为nil时可读不可写
    • 结构体指针为nil时是否可以调用方法

第二十章 for-range源码分析

  • 1 遍历数组,切片,结构体数组
  • 2 正确遍历Goroutine(解析协程启动时间)
  • 3 遍历Map(增加或删除map元素时)

第二十一章 time标准包源码分析

  • 1 比time.Now()更优雅获取时间戳(go:link技术)
  • 2 time.Format()优化写法

第二十二章 数据驱动模板源码分析-->kratos工具

  • 1 加载多个模版并指定模版生成结构体方法
  • 2 自定义扩展模版函数 FuncMap
  • 3 html模版
  • 4 generate 根据模版代码生成
  • 5 推荐第三方 sprig 模版函数

第二十三章 调试内部对象

  • 1 fmt 打印结构体中含有指针对象, 数组或者map中是指针对象, 循环结构时的困难
  • 2 go-spew 优化调试

第二十四章 命令行参数解析

  • 1 flag 基本使用及自定义帮助信息
  • 2 pflag 完全兼容flag

第二十四章 Flag命令行参数及源码分析

  • 1 标准包flag基本使用及自定义帮助信息
  • 2 第三方包pflag:兼容标准包flag

第二十五章 结构体类型方法

  • 1 方法调用语法糖

第二十六章 strconv字符串和数值型转换源码分析

第二十七章 Prometheus

  • 部署方式
    • 手工部署
    • operator 部署
  • 1 exporter
    • 1.1 内置collector
    • 1.2 使用自定义collector
  • 2 Prometheus Operator
  • 3 AlertManager
  • 4 PromQL

第二十八章 如何进行测试

  • 1 testing
    • 1.1 sub 测试并发
    • 1.2 testing.M 将测试交给TestMain调度
    • 1.3 testing.F 模糊测试
  • 2 go-mock接口测试
  • 3 web 测试
    • 3.1 使用标准包 httptest 进行 server handler 测试
    • 3.2 gock 模拟HTTP流量
  • 4 数据库测试
    • 4.1 sqlmock
    • 4.2 miniredis
  • 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内存结构管理
    • 1.1 Linux 内存管理
    • 1.2 Go 内存结构管理
  • 2 GC垃圾回收机制
    • 2.1 下次GC的时机
    • 2.2 删除Map元素时通过 runtime.MemStats 查看GC回收流程
    • 2.3 内存对象中有指针与无指针的GC对比,检测内存对象中的指针
      • 2.3.1 gc运行时间: 切片中存储10亿个指针
      • 2.3.2 gc运行时间: 切片中存储10亿个非指针
  • 3 逃逸分析
    • 3.1 argument content escapes(fmt参数内容逃逸)
    • 3.2 局部变量指针返回时被外部引用
    • 3.3 接口类型
  • 4 内存模型:happened before

第三十一章 go开发套件

  • 1 build == compile编译 + link链接,附Go包导入路径讲解
    • 1.1 Go build 构建约束(build constraint),也叫做构建标记(build tag)
    • 1.2 Go build 选项给 go 链接器传入参数 -ldflags="-X key=value来重写一个符号定义"-->符号表应用
    • 1.3 Go build 选项 -n 查看构建过程用到的命令
  • 2 Go tool 自带工具
    • 2.1 tool compile 编译
    • 2.2 tool link 链接
    • 2.3 generate 批量执行任何命令
  • 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 使用

  • 1 Makefile常用函数列表
  • 2 golang makefile 最佳实践

第三十四章 regexp 正则表达式 Regular Expression

  • 1 基本正则表达式使用

第三十五章 编码 Unicode