GO实践笔记

背景

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

    推荐阅读