go context学习

context学习

  • context的struct设计
type Context interface {
    Deadline() (deadline time.Time, ok bool)

    Done() <-chan struct{}

    Err() error

    Value(key interface{}) interface{}
}
  • struct中字段分析

    • Deadline()返回设置的截止时间和有无设置截止时间
    • Done()返回一个只读的chan,用来通知是否要释放资源
    • Err()返回取消的原因
    • Value(key interface{})获取绑定在context上的值,是一个键值对。这个值是线程安全的。(在并发情况下,能够正确处理这个共享变量)
  • context的常用方法实例
    • 参考代码
package main

import(
    "fmt"
    "time"
    "golang.org/x/net/context"
)

type faveContextKey string   //定义别名

func main(){
    fmt.Println("context包学习")
    UseContext()
    UseContextWithDeadline()
    UseContextWithTimeout()
    UseContextWithValue()
}

func UseContext(){
    // 使用withCancel生成上下文
    gen := func (ctx context.Context)<- chan int{
        dst := make(chan int)  //无缓冲,无长度
        n := 1
        fmt.Println("这个函数被调用多少次:",n)  //被调用一次
        go func (){
            for{
                select{
                // 多个case同时满足,就会随机执行case
                case <- ctx.Done():
                    // 关闭上下文
                    fmt.Println("ctx.Done",ctx.Err(),n)
                    return
                case dst <- n:   //要么运行完这个作用域,要么就不用运行
                    n++
                    fmt.Printf("n = %v \n",n)
                }
            }
        }()
        //发送器
        return dst
    }
    ctx,cancel := context.WithCancel(context.Background())
    defer cancel()
    data := gen(ctx)
    for n:= range data{  //接收
        fmt.Println(n)
        if n== 16{
            break
        }
    }
}

func UseContextWithDeadline(){
    // withDeadline作用:设置context的存活期
    d := time.Now().Add(50 * time.Millisecond)
    ctx,cancel := context.WithDeadline(context.Background(),d)
    if ctx == nil{
        fmt.Println("ctx is nil")
        return
    }
    defer cancel()
    select{
    case <-time.After(time.Second*1):
        fmt.Println("overslept")
    case <- ctx.Done():
        fmt.Println(ctx.Err())
    }
}

func UseContextWithTimeout(){
    // withTimeout作用:设置context的存活期
    ctx,cancel := context.WithTimeout(context.Background(),50*time.Millisecond)
    if ctx == nil{
        fmt.Println("ctx is nil")
        return
    }
    defer cancel()
    select{
    case <-time.After(time.Second*1):
        fmt.Println("overslept")
    case <- ctx.Done():
        fmt.Println(ctx.Err())
    }
}

func UseContextWithValue(){
    // withValue作用:带值
    f := func(ctx context.Context,k faveContextKey){
        if v := ctx.Value(k);v!=nil{
            fmt.Printf("key:%v,value:%v \n",k,v)
        }else{
            fmt.Println("key not found!",k)
        }
    }
    k := faveContextKey("language")
    ctx:= context.WithValue(context.Background(),k,"go")
    if ctx==nil{
        fmt.Println("ctx is nil")
    }
    f(ctx,k)
    f(ctx,faveContextKey("color"))
}
  • context包的用途

    • 构建树形关系的上下文,实现上一层的Goruntine控制下一层的Goruntine。通过传递context的对象变量方式对下一层的Goruntine进行管控。通知信号为context对象中的Done()进行控制。
    • 参考用例

原文地址:https://www.cnblogs.com/MyUniverse/p/11600981.html

时间: 2024-10-16 07:25:12

go context学习的相关文章

PHP Context学习系列《十》

Context用于所有的文件系统或数据流封装协议. 1.套接字context 主要是tcp,http,ftp这些基于socket的协议. 新加的bindto参数实例: <?php $opt = array( 'socket' => array( 'bindto' = > '192.168.1.1:8000', ), ); $context = stream_context_create($opt); echo file_get_contexts('www.examples.con', f

什么是架构

什么是软件架构 前言:软体设计师中有一些技术水平较高.经验较为丰富的人,他们需要承担软件系统的架构设计,也就是需要设计系统的元件如何划分.元件之间如何发生相互作用,以及系统中逻辑的.物理的.系统的重要决定的作出.在很多公司中,架构师不是一个专门的和正式的职务.通常在一个开发小组中,最有经验的程序员会负责一些架构方面的工作.在一个部门中,最有经验的项目经理会负责一些架构方面的工作.但是,越来越多的公司体认到架构工作的重要性. 什么是软件系统的架构(Architecture)?一般而言,架构有两个要

android项目实战-背呗单词DEV02-创建计划实现

该篇说明 该篇我们来详解创建计划功能实现. 创建计划功能是在创建计划界面中的. 也就是在CreatePlanActivity中 在后台模块中只描述管理层,其它的数据库操作等请自行查看 效果如图 执行流程图 创建计划UI界面功能说明 1> 横幅显示创建计划字符 hfTitleTextView = (TextView) findViewById(R.id.hfTitleTextView); hfTitleTextView.setText("创建计划"); 2> 创建计划项的填写

Pro Android学习笔记(三二):Menu(3):Context菜单

什么是Context menu 在桌面电脑,我们都很熟悉Context menu,按鼠标右键显示的菜单就是context菜单.在Android中,通过长时间鼠标按键可以触发context菜单.对于触屏设备,手指长按就是长鼠标按键事件. 一个activity有一个且只能有一个OptionMenu,一个view可以有一个且最多只能有一个ContextMenu.检查鼠标长按是基于view来监听.因此一个activity中可有多少个view,就可以有多少个ContextMenu. 注册View带有Con

openerp学习笔记 context 的应用

1.在Action中定义,context用于传递搜索条件和分组条件,在搜索视图中默认显示: 示例代码: <record model="ir.actions.act_window" id="open_company_allocation"> <field name="name">Leaves Summary</field> <field name="res_model">hr.ho

jQuery源代码学习笔记:jQuery.fn.init(selector,context,rootjQuery)代码具体解释

3.1 源代码 init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // Handle $(""), $(null), or $(undefined) //假设selector为空格.!selector为false if (!selector) { //此时this为空jQuery对象 return this; } // Handle $(DOMElement) //nodeType节

Esper学习之四:Context

Context是Esper里一个很有意思的概念,要是理解为上下文,我觉得有点不妥.以我的理解,Context就像一个框,把不同的事件按照框的规则框起来,并且有可能有多个框,而框与框之间不会互相影响.不知道各位在看完这篇文章后是否认同我的观点,我愿洗耳恭听. 1.Context基本语法 语法结构如下 [plain] view plaincopy create context context_name partition [by] event_property [and event_property

[原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Android中的context的学习理解

Android中Context的学习理解Context是一个抽象基类,通过它getResuources.getAssets and start 其他组件(Activity,Service,broadCast,getSystemService),可以这样理解:Context提供了一个运行环境for App, then app 可以访问资源,才能完成与其他组件,服务的交互,Context定义了一套基本的功能接口or一套规范 //todo