背景
- 已用GO进行项目实践。
- 阅读其它开源项目,发现自己代码实现不够规范。
- 标准库不够熟悉。
error包
- 错误的包裹,使用 Unwrap() error。
- 错误的比较,使用 Is(err, target error) bool。
- 错误的类型判断,使用 As(err error, target interface{}) bool。
- 以上做法的好处是能兼容存放和判断整个err链路的全部err,而不仅是当前的err。
context包
- 当处于请求顶层的时候,使用 Background() Context 获取一个空的context实例。
- 当不知道传递哪一个context的时候,可使用 TODO() Context 获取一个空实例临时使用。
- valueCtx只实现了创建和获取值的方法,其它接口所需方法为父context的代理方法。
- cancelCtx实现了 Done() <-chan struct{} 方法,这个结构采用懒加载,在context调用取消方法后,该chan被关闭。实现的 Value(key interface{}) interface{} 方法用于获取cancelCtx自身。Err() error 方法用于返回err。
- timerCtx实现了Deadline() (deadline time.Time, ok bool),利用定时器及cancelCtx实现超时取消的能力。WithDeadline和WithTimeout都实现自timerCtx。
- 包裹valueCtx时,应使用自定义的非导出类型和非导出变量作为key,并提供封装好的获取值的方法,避免在外部使用key直接获取值。这样可以规避全局key的污染问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。