GolangNote

Golang笔记

golang 上下文的使用例子

Permalink

context 提供在不同的Handler 或Middleware 共享变量的功能,即通常所说的上下文。

golang context

gorilla/context 是一个很好的库:

Go: gorilla/context
1
2
3
4
5
6
7
8
9
10
11
12
13
// 先定义
var (
  mutex sync.RWMutex
  data  = make(map[*http.Request]map[interface{}]interface{})
)

func myHandler(w http.ResponseWriter, r *http.Request) {
  context.Set(r, "foo", "bar")
}

func myOtherHandler(w http.ResponseWriter, r *http.Request) {
  val := context.Get(r, "foo").(string)
}

goji 在他自身的框架里也有实现,使用更方便 web.C :

Go: goji
1
2
3
4
5
6
7
8
9
10
11
12
func myMiddleware(c *web.C, h http.Handler) http.Handler {
  fn := func (w http.ResponseWriter, r *http.Request) {
    c.Env["name"] = "world"
    h.ServeHTTP(w, r)
  }

  return http.HandlerFunc(fn)
}

func hello(c web.C, w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, %s!", c.Env["name"].(string))
}

更新

上面是很早的解决方案, 自从 Go 1.7 后,就可以使用标准库 http.Request.Context() 来处理上下文。

在 go1.7 之前,context 还是非编制的,存在(golang.org/x/net/context)中,golang 团队发现 context 这个东西很好用,于是把它收编了,1.7 版本正式进入了标准库。专门用来简化处理多个goroutine之间与请求域的数据、取消信号、截止时间等相关操作。

对服务器传入的请求应该创建上下文,而对服务器的传出调用应该接受上下文,它们之间的函数调用链必须传递上下文,或者可以使用 WithCancelWithDeadlineWithTimeOutWithValue 创建的派生上下文,当一个上下文被取消时,它派生的所有上下文也被取消。

跟 web 上下文关系大的 参见 https://golang.google.cn/pkg/net/http/#Request.WithContext

Related articles

golang snappy 的使用场合

google 自家的 snappy 压缩优点是非常高的速度和合理的压缩率。压缩率比 gzip 小,CPU 占用小。...

golang Selenium WebDriver 使用记录

Selenium WebDriver 直接通过浏览器自动化的本地接口来调用浏览器,以达到模拟浏览器行为的操作,如点击、选择、鼠标移动等。下面是记录个人使用golang 驱动的记录。...

Write a Comment to "golang 上下文的使用例子"

Submit Comment Login
Based on Golang + fastHTTP + youdb | go1.16 Processed in 1ms