1. 程式人生 > 其它 >【Go】初識Context與Context鍵值對的可能情況

【Go】初識Context與Context鍵值對的可能情況

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
    

分析

  1. ctx傳入nil的時候會panic
    • panic: runtime error: invalid memory address or nil pointer dereference
  2. ctx傳入一個emptyCtx的時候
    • 斷言判斷會失敗,ok為false。
    • 不會panic。
  3. ctx傳入一個有value的ctx時
    • 斷言判斷成功,獲得value。