go context学习

2023-11-10

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()进行控制。
    • 参考用例

1437248-20190927231526056-1090183216.png

转载于:https://www.cnblogs.com/MyUniverse/p/11600981.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go context学习 的相关文章

  • git基础语法(一)

    1 常用命令 git clone 克隆项目把远程仓库拉取到本地 git clone 地址 分支 默认master git clone git gitee com liuzhenyu666 test0130 git 默认拉取master分支代

随机推荐

  • 串行、并行、同步和异步:通信与数据传输的核心概念及应用举例

    当涉及到通信和数据传输时 串行 并行 同步和异步是一些重要的概念 下面我将为您编写一篇关于这些概念的详细博客文章 串行 并行 同步和异步 通信与数据传输的核心概念 1 串行与并行 串行 Serial 指的是逐个传输数据位 一次只传输一个位
  • 编写高质量代码:改善Java程序的151个建议(第1章建议1~5)

    本系类文章 用来记录 编写高质量代码 改善java程序的151个建议 这本书的读书笔记 方便自己查看 也方便大家查阅 在此感谢原书作者秦小波对java的独特见解 帮助java爱好者的成长 由于篇幅原因本人将读书笔记采取分批记忆的方式来进行记
  • CNN - 卷积神经网络输入层

    数据输入层 Input Layer 1 数据预处理 进行预处理的主要原因是 输入数据单位不一样 可能会导致神经网络收敛速度慢 训练时间长 数据范围大的输入在模式分类中的作用可能偏大 而数据范围小的作用就有可能偏小 由于神经网络中存在的激活函
  • 双向绑定鼠标移入移出事件解决左右拼接table鼠标移到目标表格样式同步展示问题

    问题 用两个表格tabale显示一组同源数据 两个table显示数组的需求不同 但是相关联 当鼠标移入移出相应 行 也就是 的时候 另一个table表格中相依 行 也要动态显示出来对应 css样式 思路 利用两个不同得table元素下的 添
  • 华为机试原题4.26

    1 报数游戏 输入一个整数m 有1 lt n lt 100个人参与报数游戏 从1 2 m报数 报m的人淘汰 下一轮接着从1开始报数到m 一直循环 直到剩下的人数小于m时停止 输入 m 输出 最终剩下的m 1个数 例 输入 3 输出 58 9
  • 解决eclipse安装了spring ide插件,但是在window-preferences里没有spring相关的选项的问题

    很多人的myeclipse eclipse装了spring插件后 出现了一些问题 大家装了spring插件之后 myeclipse eclipse就会显示如下图 我这里也没有spring的相关选项 但是 在项目里new右键菜单以及首首选项都
  • 容灾恢复

    欢迎关注 全栈工程师修炼指南 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 涉及 企业运维 网络安全 应用开发 物联网 人工智能 大数据 学习知识 花开堪折直须折 莫待无花空折枝 作者主
  • 响应式布局的实现方法和原理

    昨天我在马海祥博客上跟大家详细的介绍过 什么是响应式网页设计 我觉的响应式网页设计不仅仅是一种趋势 还更是一个新的设计解决方案 它有助于解决不同的分辨率和设备 台式电脑 笔记本电脑 平板 手机 相关的设计问题 既然是设计的问题 这里就会涉及
  • 怎样编写好的API?看完你就知道了!

    点击上方 编程技术圈 关注 星标或置顶一起成长 后台回复 大礼包 有惊喜礼包 每日英文 Do a plain and neat person looking to stay in the small and light things awa
  • Flutter 如何实现禁止手机横屏的功能

    来源 https sexywp com flutter disable landscape mode htm 在一些特定的 App 里 我们不希望手机横屏的时候 App 发生旋转 比如微信 企业微信都是这样的 代码可以这样设定 import
  • C 标准库 - 《stdlib.h》

    原文链接 https www runoob com cprogramming c standard library stdlib h html 简介 stdlib h 头文件定义了四个变量类型 一些宏和各种通用工具函数 库变量 下面是头文件
  • 基础知识:虚拟机的构成和cpu的虚拟化

    1 计算虚拟化包括了 一虚多 和 多虚一 现在阶段硬件能力过盛 一虚多 成为主流 2 裸金属架构更适合部署在资源池内如VMWARE CitrixXenServerv RHEV 适合企业使用 寄居架构适合单机 适合个人折腾 3 全虚拟化和半虚
  • vscode配置golang远程开发调试环境

    1 vscode配置golang远程开发调试环境 文章目录 1 vscode配置golang远程开发调试环境 1 1 golang远程开发应用场景 1 2 远程开发调试环境搭建 1 3 远程debug运行配置 1 1 golang远程开发应
  • [以太坊源代码分析] IV. 椭圆曲线密码学和以太坊中的椭圆曲线数字签名算法应用

    数字签名算法在Ethereum中的应用不少 目前已知至少有两处 一是在生成每个交易 Transaction tx 对象时 对整个tx对象进行数字签名 二是在共识算法的Clique算法实现中 在针对新区块进行授权 封印的Seal 函数里 对新
  • Vue-Cli的简单入门使用

    说明 这篇文章是为了让我和组里同学快速上手 学会使用Vue Cli的基本使用而写的 里面可能有许多错误 还请仔细识别 当然 欢迎指正 Vue Cli简单使用 说明 框架的创建 创建代码 安装时报错及解决办法 安装完毕后的构建操作 报错及解决
  • 必看五大安全趋势 Fortinet全球威胁态势报告发布

    全球领先的网络安全解决方案提供商Fortinet NASDAQ FTNT 于近日发布2021年下半年 全球威胁态势报告 据报告显示 当前全球网络攻击的自动化和攻击速度均显著提升 更具破坏性 不可预测性且更加持续的网络犯罪正快速演进 此外 伴
  • win10+使用cmake编译最新的ceres-solver库

    参考文献 点击这里访问 感谢大佬 说明 我这个只编译了release版本 如果还需要debug版本 cmake编译和vs编译都需要另外设置一些东西 我没有弄 文章目录 参考文献 说明 1 需要使用的库 2 需要的工具 3 准备工作 3 1
  • python学习笔记—— socket编程

    上篇 https blog csdn net qq 42489308 article details 89388112 socket编程 什么是socket 简称套接字 是进程间通信的一种方式 它与其他进程间通信的一个主要不同是 它能实现不
  • vue的组件化开发

    vue的组件化开发 组件 Component 是 Vue js 最强大的功能之一 组件可以扩展 HTML 元素 封装可重用的代码 官方文档 https cn vuejs org v2 guide components registratio
  • go context学习

    context学习 context的struct设计 type Context interface Deadline deadline time Time ok bool Done lt chan struct Err error Valu