Go:context包
Go:context包
1. 簡介
1.1. 作用
主要用Goroutine管理,停止Goroutine或之間引數傳遞。
1.2. 核心介面
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key interface{}) interface{}
}
方法 | 說明 |
---|---|
Deadline | 返回截止時間和是否存在截止時間 |
Done | 獲取完成chan |
Err | Done關閉的原因,沒有關閉返回nil |
Value | 獲取上下文中儲存的使用者值 |
2. 演示
2.1. WithCancel
上下文取消
package main
import (
"context"
"fmt"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// 啟動工人去幹活
go worker(ctx)
time.Sleep(time.Second * 5)
// 告訴工人停止幹活
cancel()
time.Sleep(time.Second * 1)
}
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("work over")
return
default:
fmt.Println("at work")
time.Sleep(time.Second * 1)
}
}
}
2.2. WithTimeout
上下文超時
package main
import (
"context"
"encoding/hex"
"fmt"
"io/ioutil"
"net/http"
"time"
)
type Result struct {
r *http.Response
err error
}
func main() {
// 請求超時時間設定為10秒
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
res, err := httpGet(ctx)
if err != nil {
panic(err)
}
defer res.Body.Close()
data, err := ioutil.ReadAll(res.Body)
if err != nil {
panic(err)
}
fmt.Println(hex.Dump(data))
}
func httpGet(ctx context.Context) (*http.Response, error) {
reqResult := make(chan Result, 1)
go func() {
res, err := http.Get("https://www.baidu.com")
reqResult <- Result{res, err}
}()
select {
case <-ctx.Done():
return nil, ctx.Err()
case result := <-reqResult:
return result.r, nil
}
}
2.3. WithDeadline
上下文截止時間
package main
import (
"fmt"
"golang.org/x/net/context"
"time"
)
func main() {
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second * 5))
defer cancel()
select {
case <-time.After(time.Second * 10):
fmt.Println("time.After timeout")
case <-ctx.Done():
// 5秒過後執行,列印:context deadline exceeded
fmt.Println(ctx.Err())
}
}
2.4. WithValue
上下文傳參
package main
import (
"context"
"fmt"
"time"
)
func main() {
ctx := context.WithValue(context.Background(), "id", 1)
go GetID(ctx)
time.Sleep(1 * time.Second)
}
func GetID(ctx context.Context) {
id, ok := ctx.Value("id").(int)
if ok {
fmt.Println(id)
}
}
2.5. 組合寫法
package main
import (
"context"
"fmt"
"time"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 10 * time.Second)
defer cancel()
ctx = context.WithValue(ctx, "id", 1)
ctx = context.WithValue(ctx, "name", "yimt1")
// 會覆蓋上面值
ctx = context.WithValue(ctx, "name", "yimt2")
if id, ok := ctx.Value("id").(int); ok {
fmt.Println(id)
}
if name, ok := ctx.Value("name").(string); ok {
fmt.Println(name)
}
}
相關文章
- Go 語言 context 包實踐GoContext
- Go語言Context包原始碼學習GoContext原始碼
- Go ContextGoContext
- context包Context
- Go語言的context包從放棄到入門GoContext
- go 上下文:context.ContextGoContext
- Go語言之ContextGoContext
- Go context 介紹GoContext
- Go Context 原理詳解GoContext
- 深入理解Go ContextGoContext
- Go標準庫ContextGoContext
- Golang Context 包詳解GolangContext
- golang中的context包GolangContext
- 九. Go併發程式設計--context.ContextGo程式設計Context
- 深度解密Go語言之context解密GoContext
- 深度解密 Go 語言之 context解密GoContext
- go context剖析之使用技巧GoContext
- 【Go語言】小白也能看懂的context包詳解:從入門到精通GoContext
- 深入解釋了Go context使用方式GoContext
- 測試 iris 時自定義 context 包Context
- Go 語言基礎之 Context 詳解GoContext
- 【Go進階—併發程式設計】ContextGo程式設計Context
- go reflect包中abi.goGo
- Go標準包-http包serverGoHTTPServer
- Go unsafe包Go
- Go strconv包Go
- go 閉包函式Go函式
- Go | 閉包的使用Go
- Go之time包用法Go
- Go 操作kafka包saramaGoKafka
- go語言處理TCP拆包/粘包GoTCP
- Go標準包——net/rpc包的使用GoRPC
- Go TCP 粘包問題GoTCP
- Go標準包—http clientGoHTTPclient
- Go 閉包的實現Go
- Go module 本地導包方式Go
- 聊聊Go裡面的閉包Go
- GO語言————6.8 閉包Go