设计 #
Go语言的设计哲学 #
Go语言的组合设计哲学 #
垂直组合与水平组合 #
Go语言提供的正交性 #
接受接口返回结构体 #
包装器模式 #
适配器函数类型(http.HandlerFunc) #
中间件应用模式 #
什么是 type set #
版本 #
Go语言的版本发布策略 #
retract指示符 #
升级module的major版本号 #
变量 #
控制结构 #
类型 #
常量 #
数值类型 #
string #
数组和切片 #
数组的切片化 指根据已经存在的数组来创建切片。
切片与map与零值可用,切片的零值可用,而map结构的零值不可用。
Full Slice Expression 可用于强制切片的扩容。
map #
- 省略字面值中的元素类型
- 使用map的三个注意点
- map类型在Go运行时层的实现
- tophash区域
- 使用struct类型做为map的key
- 分片加锁
- 使用sync.Map的特殊场景
- sync.Map的几个优化点
struct #
嵌入字段的用法 #
实现继承的原理 #
interface #
空接口类型 #
动静兼备 #
接口的内部结构 #
eface结构 用于表示没有方法的空接口。 iface结构 用于表示非空的拥有方法的接口。 iface与eface 比较了两个结构的差别。 iface与eface结构不同,但在比较时,go却会做特殊的处理。具体的例子参考: 空接口类型变量与非空接口类型变量的等值比较 Go语言中将某类型变量赋值给接口变量的过程称为“装箱” ,具体原理参考: 接口类型的装箱(boxing)原理 装箱后的数据与原变量的值再无瓜葛 nil error 值 != nil 来自 Go FAQ的问题。
接口完整性检查 #
函数 #
显式转换为HandlerFunc类型 #
方法表达式(Method Expression) #
defer的运作机制 #
defer表达式的执行次序 #
具名返回值 #
T类型与*T类型方法集合的差别 #
方法集合决定接口实现 #
结构体中嵌入结构体后的方法集合 #
defined类型继承的方法集合 #
alias类型继承的方法集合 #
error #
- 两种构造错误值的方法
- 哨兵错误处理策略
- 判断包装错误WrappedError
- 错误值类型检视策略
- 错误行为特征检视策略
- Panicking过程
- recover的过程
- pkg errors包是如何输出错误信息及堆栈信息的
并发 #
chan #
chan数据结构 为什么不能用len来判满或判空 用nil channel解决关闭的channel输出0的问题 用通道来等待主goroutine chan导致的goroutine泄漏 使用反射操作Channel 击鼓传花
Mutex #
Mutex的架构演进 “谁申请,谁释放”的原则 Mutex不是可重入的锁 实现读写锁的三种方案
Cond #
条件变量的Wait方法主要做了哪四件事情 使用 Cond 的 2 个常见错误
sync.Pool #
Context #
Context链式查找 WithCancel WithDeadline返回的cancel的正确用法 Context知识结构
原子性 #
不同架构的原子操作指令是不同的 使用atomic和直接内存操作的区别 使用atomic实现Lock-Free queue
Module #
init函数 #
三个行为特征 重置包级变量值 实现对包级变量的复杂初始化 实现“注册模式”