使用方法
contextcontextcontext
context
  • 作为函数调用的第一个参数
  • 作为一个请求结构体的可选配置
func (d *Dialer) DialContext(ctx context.Context, network, address string) (Conn, error){}
func (r *Request) WithContext(ctx context.Context) *Request
contextcontextcontextmaincontext.BackGorund()
contextcontextcontextcontextcontext
context
func WithValue(parent Context, key, val interface{}) Contex
key
contextrequest-scopedcontext
// 参数意义不明确
func IsAdminUser(ctx context.Context) bool {
    x := token.GetToken(ctx)
    userObject := auth.AuthenticateToken(x)
    return userObject.IsAdmin() || userObject.IsRoot()
}

// 明确参数的意义,这是合理的方式
func IsAdminUser(token string, authService AuthService) int {
    userObject := authService.AuthenticateToken(token)
    return userObject.IsAdmin() || userObject.IsRoot()
}
userIdcontextlog
context.Value
  • 不要把Context放在结构体中,要以参数的方式传递,parent Context一般为Background
  • 应该要把Context作为第一个参数传递给入口请求和出口请求链路上的每一个函数,放在第一位,变量名建议都统一,如ctx。
  • 给一个函数方法传递Context的时候,不要传递nil,否则在tarce追踪的时候,就会断了连接
  • Context的Value相关方法应该传递必须的数据,不要什么数据都使用这个传递
  • Context是线程安全的,可以放心的在多个goroutine中传递
  • 可以把一个 Context 对象传递给任意个数的 gorotuine,对它执行取消操作时,所有 goroutine 都会接收到取消信号。
参考资料:
  • https://blog.golang.org/context
  • https://juejin.im/post/5a6873fef265da3e317e55b6
  • https://www.ardanlabs.com/blog/2019/09/context-package-semantics-in-go.html
  • http://p.agnihotry.com/post/understanding_the_context_package_in_golang/
  • https://medium.com/@cep21/how-to-correctly-use-context-context-in-go-1-7-8f2c0fafdf39