zoukankan      html  css  js  c++  java
  • 【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的指针。
    • 其他Context
      • cancelCtx:可能被cancel的context。
      • timerCtx:带计时器和截止日期的cancelCtx。

    测试

    代码

    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。
  • 相关阅读:
    一、面试准备Java知识
    SSM框架学习之Spring学习笔记
    新年过后 第一天上班
    tomcat学习笔记
    第一次写博客
    SQL Server 2005 数据类型 .NET Framework 数据类型 LINQ 数据类型
    Winform下编译Dev控件时提示license.licx文件错误
    将C#数据转化成Word文档
    得到相同的数据 雨
    SQl 2005 存储过程分页 雨
  • 原文地址:https://www.cnblogs.com/xuwanwei/p/15118778.html
Copyright © 2011-2022 走看看