使用方法
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