【Go】初識Context與Context鍵值對的可能情況
阿新 • • 發佈:2021-08-09
Prologue
- 寫程式碼的時候,遇到需要從context中獲得value的情況。
- 但是寫的時候,會忽視可能的邊界條件,導致panic。
初識Context
Context定義
-
Context是個interface。
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key interface{}) interface{}
}
幾種Context
context.Background
:這個返回的是一個empty, non-nil 的Context, 裡面是沒有value的。- 返回的是
emptyCtx
- 返回的是
context.WithValue
:這個函式返回的是一個有key-value的Context。- 返回的是一個
valueCtx
的指標。
- 返回的是一個
測試
程式碼
package main import ( "context" "fmt" ) const KEY = "myKey" func f(ctx context.Context){ val := ctx.Value(KEY) v, ok := val.(string) if ok{ fmt.Println("get val:", v) }else{ fmt.Println("failed") } } func main() { // nil ctx // f(nil) will panic // empty ctx, no val ctx := context.Background() f(ctx) // ctx that has val ctx = context.WithValue(ctx, KEY, "my value") f(ctx) }
結果
-
panic: runtime error: invalid memory address or nil pointer dereference
-
failed get val: my value
分析
- ctx傳入nil的時候會panic
panic: runtime error: invalid memory address or nil pointer dereference
- ctx傳入一個emptyCtx的時候
- 斷言判斷會失敗,ok為false。
- 不會panic。
- ctx傳入一個有value的ctx時
- 斷言判斷成功,獲得value。