静态网页模版/合肥网络seo推广服务

静态网页模版,合肥网络seo推广服务,商品分类标准,陕西省城乡建设网站1.Context接口2.emptyCtx3.Deadline()方法4.Done()方法5.Err方法6.Value方法()7.contex应用场景8.其他context方法 1.Context接口 Context接口只有四个方法,以下是context源码。 type Context interface {Deadline() (deadline time.Time, …

    • 1.Context接口
    • 2.emptyCtx
    • 3.Deadline()方法
    • 4.Done()方法
    • 5.Err方法
    • 6.Value方法()
    • 7.contex应用场景
    • 8.其他context方法

1.Context接口

Context接口只有四个方法,以下是context源码。

type Context interface {Deadline() (deadline time.Time, ok bool)Done() <-chan struct{}Err() errorValue(key any) any
}

2.emptyCtx

context接口源码中有两个对外的实现,context.Background()和context.TODO(),都返回一个emptyCtx。

Background()和TODO()可以看作是emptyCtx的别名,用法如下:

  • Background(),当我们自己创建一个context,可以用context.Background();
  • TODO(),当我们调用一个方法,方法有个参数是context,我们又没有context可以传,就可以传context.TODO()。
func Background() Context {return backgroundCtx{}
}
func TODO() Context {return todoCtx{}
}
type backgroundCtx struct{ emptyCtx }
type todoCtx struct{ emptyCtx }type emptyCtx struct{}
func (emptyCtx) Deadline() (deadline time.Time, ok bool) {return
}
func (emptyCtx) Done() <-chan struct{} {return nil
}
func (emptyCtx) Err() error {return nil
}
func (emptyCtx) Value(key any) any {return nil
}

3.Deadline()方法

Deadline() (deadline time.Time, ok bool)

返回这个context的deadline(结束时间)和ok,如果context设置了deadline,ok=ture,反之ok=false
如下可以看到,context如果没有设置deadline,则默认时间是“0001-01-01 00:00:00 +0000 UTC”

func TestContextDeadline(t *testing.T) {ctx := context.Background()deadline, ok := ctx.Deadline()fmt.Println(deadline)     //输出,0001-01-01 00:00:00 +0000 UTCfmt.Print(ok)  // 输出,false
}

下面这是设置了时间的,可以看到dealine是当前时间加10秒,

func TestContextDeadline(t *testing.T) {fmt.Println(time.Now())ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(10*time.Second))deadline, ok := ctx.Deadline()fmt.Println(deadline)fmt.Println(ok)
}
输出:
2025-03-09 15:58:20.2027155 +0800 CST m=+0.001014101
2025-03-09 15:58:30.2080898 +0800 CST m=+10.006388401
true

如里对一个子contex设置的deadline时间比已有的contex大(就是比父context大),则不会生效

func TestContextDeadline2(t *testing.T) {fmt.Println(time.Now())ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(10*time.Second))fmt.Println(ctx.Deadline())ctx2, _ := context.WithDeadline(ctx, time.Now().Add(15*time.Second))fmt.Println(ctx2.Deadline())
}
输出:
2025-03-09 18:11:08.6194041 +0800 CST m=+0.001034701
2025-03-09 18:11:18.6251276 +0800 CST m=+10.006758201 true
2025-03-09 18:11:18.6251276 +0800 CST m=+10.006758201 true

ctx2的dealine并没有加15秒,而是和父deadline一样。
如果子deadline比父小,子deadline就会生效,并且父deadline不受影响。如下:

func TestContextDeadline2(t *testing.T) {fmt.Println(time.Now())ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(10*time.Second))fmt.Println(ctx.Deadline())ctx2, _ := context.WithDeadline(ctx, time.Now().Add(5*time.Second))fmt.Println(ctx2.Deadline())fmt.Println(ctx.Deadline())
}
输出:
2025-03-09 18:16:08.5541102 +0800 CST m=+0.003605801
2025-03-09 18:16:18.5612081 +0800 CST m=+10.010703701 true
2025-03-09 18:16:13.5612081 +0800 CST m=+5.010703701 true
2025-03-09 18:16:18.5612081 +0800 CST m=+10.010703701 true

4.Done()方法

Done() <-chan struct{}

Done()返回一个chan,当调用<-ctx.Done(),会一直阻塞,如果ctx的deadline时间到了,才能从chan返回

func TestContextDone(t *testing.T) {fmt.Println(time.Now())ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(10*time.Second))deadline, ok := ctx.Deadline()fmt.Println(deadline)fmt.Println(ok)<-ctx.Done()   //Done()会一直阻塞等到deadline时间到了才结束fmt.Println(time.Now())    //当前时间加了10秒,因为<-ctx.Done() 阻塞了10秒
}
输出:
2025-03-09 16:02:27.898926 +0800 CST m=+0.001548101
2025-03-09 16:02:37.9048716 +0800 CST m=+10.007493701
true
2025-03-09 16:02:37.9052627 +0800 CST m=+10.007884801

注意context.WithDeadline()方法还返回一个cancel

func TestContextDeadline(t *testing.T) {fmt.Println(time.Now())ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(10*time.Second))deadline, ok := ctx.Deadline()fmt.Println(deadline)fmt.Println(ok)cancel()    //cancel会让context立刻结束,<-ctx.Done() ///Done()不会阻塞fmt.Println(time.Now())
}
输出:
2025-03-09 17:25:36.815137 +0800 CST m=+0.001292801
2025-03-09 17:25:46.8209512 +0800 CST m=+10.007107001
true
2025-03-09 17:25:36.8209512 +0800 CST m=+0.007107001

如果ctx没有设置deadline,ctx.Done()返回nil

func TestContextDone(t *testing.T) {ctx := context.Background()fmt.Println(ctx.Done())   //输出nil
}

5.Err方法

Err() error

返回一个错误,有两种错误
1.deadline时间到了
2.ctx被cancel了

以下是deadline时间到了的示例:

  • ctx设置10秒后结束 ,第一次调用ctx.Err(),输出nill(因为还没到10秒,ctx还没结束)
  • 等到11秒后,ctx.Err()输出了结束原因context deadline exceeded(deadline到时间结束)。

如果ctx结束了,调用ctx.Err()返回的结果一样,下面调用了三次,结果一样。

func TestContextErr(t *testing.T) {fmt.Println(time.Now())ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(10*time.Second))fmt.Println(ctx.Err())time.Sleep(11 * time.Second)fmt.Println(time.Now())fmt.Println(ctx.Err())fmt.Println(ctx.Err())fmt.Println(ctx.Err())
}
输出:
2025-03-09 16:17:04.7489444 +0800 CST m=+0.001009401
<nil>
2025-03-09 16:17:15.7551472 +0800 CST m=+11.007212201
context deadline exceeded
context deadline exceeded
context deadline exceeded

以下是cancel示例

func TestContextDeadline(t *testing.T) {fmt.Println(time.Now())ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(10*time.Second))deadline, ok := ctx.Deadline()fmt.Println(deadline)fmt.Println(ok)cancel()      //调用了cancel()<-ctx.Done() fmt.Println(time.Now())fmt.Println(ctx.Err())
}
输出:
2025-03-09 17:54:11.8989047 +0800 CST m=+0.001138201
2025-03-09 17:54:21.9048333 +0800 CST m=+10.007066801
true
2025-03-09 17:54:11.9048333 +0800 CST m=+0.007066801
context canceled

6.Value方法()

Value(key any) any

就是往context存了key/value形式的数据,然后通过Value()方法取出这个值。

func TestContextValue(t *testing.T) {ctx := context.WithValue(context.Background(), "name", "daniel")fmt.Println(ctx.Value("name"))     //输出daniel
}

7.contex应用场景

context是多线程安全的,常用于并发控制技术,在不同的goroutine之间同步请求特定的数据、取消信号以及处理请求的dealine(截止日期)。
通知其他goroutine结束
如下所示,设置findUser()方法只能查找用户10秒钟,10秒后强制结束这个goroutine。

func findUser(ctx context.Context, id int) {//输出ctx结束时间fmt.Println(ctx.Deadline())for {//模拟根据id查找用户time.Sleep(2 * time.Second)select {case <-ctx.Done():fmt.Println("ctx被取消,查找结束")fmt.Println(ctx.Err())fmt.Println(time.Now())returndefault:fmt.Println("正在查找中...")}}
}func TestContext(t *testing.T) {fmt.Println(time.Now())ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(10*time.Second))go findUser(ctx, 100)time.Sleep(20 * time.Second)
}
输出:
2025-03-09 16:46:05.7818671 +0800 CST m=+0.000000001
2025-03-09 16:46:15.7892368 +0800 CST m=+10.007369701 true
正在查找中...
正在查找中...
正在查找中...
正在查找中...
ctx被取消,查找结束
context deadline exceeded
2025-03-09 16:46:15.7919931 +0800 CST m=+10.010126001

8.其他context方法

cotext还有很多其他方法,相当于返回context的一个特定实现(context内部的实现),各有不同的功能。
在这里插入图片描述
ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(10*time.Second))
比如上面这个会返回一个带deadline方法,其实是返回一个timerCtx,里面记下了deadline,
可以看到这些方法里面都有c.m.lock()方法,所以context是多线程安全的。
context源码也比较简单,有兴趣自行看看源码。
在这里插入图片描述
timerCtx开头是小写的,也就是context内部的实现
在这里插入图片描述
context.WithDeadlineCause()也可以自定义一个cause

func TestContextDeadlineCause(t *testing.T) {ctx, _ := context.WithDeadlineCause(context.Background(),time.Now().Add(10*time.Second), errors.New("my error"))fmt.Println(context.Cause(ctx))time.Sleep(11 * time.Second)  //context.Cause(ctx)先输出nill,等结事时间到了才输出真正的causefmt.Println(context.Cause(ctx))
}
输出
<nil>
my error

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在VMware Workstation Pro上轻松部署CentOS7 Linux虚拟机

首先我们需要下载VM虚拟机和Centos7的镜像 下载并安装VMware Workstation Pro 访问VMware Workstation Pro官网下载 https://www.vmware.com/ 第二步&#xff1a;下载centos7镜像 访问centos官网下载 https://www.centos.org/ 开始部署Centos7 点击创建新的虚拟机 这里是Cen…

Android AudioFlinger(五)—— 揭开AudioMixer面纱

前言&#xff1a; 在 Android 音频系统中&#xff0c;AudioMixer 是音频框架中一个关键的组件&#xff0c;用于处理多路音频流的混音操作。它主要存在于音频回放路径中&#xff0c;是 AudioFlinger 服务的一部分。 上一节我们讲threadloop的时候&#xff0c;提到了一个函数pr…

从0开始的操作系统手搓教程27:下一步,实现我们的用户进程

目录 第一步&#xff1a;添加用户进程虚拟空间 准备冲向我们的特权级3&#xff08;用户特权级&#xff09; 讨论下我们创建用户线程的基本步骤 更加详细的分析代码 用户进程的视图 说一说BSS段 继续看process.c中的函数 添加用户线程激活 现在&#xff0c;我们做好了TSS…

Node 使用 SSE 结合redis 推送数据(echarts 图表实时更新)

1、实时通信有哪些实现方式&#xff1f; 特性轮询&#xff08;Polling&#xff09;WebSocketSSE (Server-Sent Events)通信方向单向&#xff08;客户端 → 服务端&#xff09;双向&#xff08;客户端 ↔ 服务端&#xff09;单向&#xff08;服务端 → 客户端&#xff09;连接方…

Android Native 之 文件系统挂载

一、文件系统挂载流程概述 二、文件系统挂载流程细节 1、Init启动阶段 众所周知&#xff0c;init进程为android系统的第一个进程&#xff0c;也是native世界的开端&#xff0c;要想让整个android世界能够稳定的运行&#xff0c;文件系统的创建和初始化是必不可少的&#xff…

Redis--Set类型

目录 一、引言 二、介绍 三、命令 1.sadd,smembers,sismember 2.spop&#xff0c;srandmember 3.smove&#xff0c;srem 4.sinter&#xff0c;sinterstore 5.sunion,sunionstore,sdiff,sdiffstore 四、内部编码 1.intset 2.hashtable 五、应用场景 1.使用Set保存用…

Faster R-CNN原理详解以及Pytorch实现模型训练与推理

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

使用dockerfile创建镜像

1.什么是Dockerfile Dockerfile 是一个用于指导 Docker 镜像构建过程的脚本文件。它通过一系列指令来详细描述了构建镜像所需的步骤和配置细节。利用 Dockerfile&#xff0c;我们可以精确地设定容器的运行环境&#xff0c;安装必要的软件&#xff0c;复制项目文件&#xff0c;…

大脑宏观结构中的富集俱乐部:图论分析视角

摘要 大脑是一个高度复杂的网络。越来越多的证据支持大脑网络中一组重要脑区的关键作用&#xff0c;这些脑区通常被称为大脑的“核心”或“枢纽”区域。这些区域不仅能量消耗较高&#xff0c;而且在神经信息传递方面的效率也极高&#xff0c;因此被称为“富集俱乐部”。富集俱乐…

Redis7——进阶篇(五)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…

光谱相机检测肉类新鲜度的原理

光谱相机通过分析肉类样本在特定波长范围内的光谱反射特性&#xff0c;结合化学与生物指标的变化规律&#xff0c;实现对其新鲜度的无损检测。其核心原理可概括为以下方面&#xff1a; 一、光谱特征与物质成分的关联性 ‌物质特异性吸收/反射‌ 不同化学成分&#xff08;如水分…

c#面试题整理9

1.遍历xml文档 2.解释一下这段 String s new String("xyz"); 这段在C#平台中&#xff0c;编译失败 3.说明一下抽象类 抽象类可以有构造函数 抽象类不能是静态和密封的类&#xff0c;密封的类表示无法继承&#xff0c;抽象类本身就不可实例化&#xff0c;加不好…

《React 属性与状态江湖:从验证到表单受控的实战探险》

属性初识 属性能解决两个大问题&#xff1a;通信和复用 props.js: import React, { Component } from react import Navbar from ./Navbarexport default class App extends Component {state {a:100}render() {return (<div><div><h2>首页</h2>&l…

Qwen/QwQ-32B 基础模型上构建agent实现ppt自动生成

关心Qwen/QwQ-32B 性能测试结果可以参考下 https://zhuanlan.zhihu.com/p/28600079208https://zhuanlan.zhihu.com/p/28600079208 官方宣传上是该模型性能比肩满血版 DeepSeek-R1&#xff08;671B&#xff09;&#xff01; 我们实现一个 使用Qwen/QwQ-32B 自动生成 PowerPoi…

[杂学笔记] TCP和UDP的区别,对http接口解释 , Cookie和Session的区别 ,http和https的区别 , 智能指针 ,断点续传

文章目录 1. TCP和UDP的区别2. 对http接口解释3. Cookie和Session的区别4. http和https的区别5. 智能指针6.断点续传 1. TCP和UDP的区别 tcp的特点&#xff1a; 面向连接&#xff0c;可靠性高&#xff0c;全双工&#xff0c;面向字节流udp特点&#xff1a;无连接&#xff0c;不…

Matlab中快速查找元素索引号

1、背景介绍 在算法设计过程中&#xff0c;有时候需要从一维/二维数组中&#xff0c;快速查找是否某个元素&#xff0c;以及该元素所在的位置。如一维矩阵[1 2 3 4 5 6 6 7 8]所示&#xff0c;元素6所在的位置为6 7。 2、函数测试 matlab中函数find()可以快速查找到指定元素所…

【DuodooTEKr 】多度科技 以开源之力,驱动企业数字化转型

多度科技 背景 / Background 在全球产业链重构与国内经济双循环的浪潮下&#xff0c;中国制造业与贸易企业正面临数字化升级的迫切需求。开源技术作为数字化转型的基石&#xff0c;不仅能打破技术壁垒、降低企业成本&#xff0c;更能通过协作创新加速产业智能化进程。 多度科技…

【HarmonyOS Next】鸿蒙应用故障处理思路详解

【HarmonyOS Next】鸿蒙应用崩溃处理思路详解 一、崩溃问题发现后定位 1. 崩溃现象&#xff1a; 常见的崩溃问题表现为&#xff0c;应用操作后白屏闪退&#xff0c;或者应用显示无响应卡死。 2.定位问题&#xff1a; 发现崩溃后&#xff0c;我们首先需要了解复现步骤&#x…

linunx ubuntu24.04.02装libfuse2导致无法开机进不了桌面解决办法

osu.appimage运行需要libfuse2 然后我就下了fuse,打了两把第二天无法开机 这样是不能开机的 这样是可以开机的 解决办法一&#xff1a;玩星火商店的osu&#xff0c;好了问题解决 解决办法二&#xff1a; 在这个页面 ctrl alt f2进入tty6 sudo apt install ubuntu-desktop 进…

C++蓝桥杯基础篇(十一)

片头 嗨~小伙伴们&#xff0c;大家好&#xff01;今天我们来学习C蓝桥杯基础篇&#xff08;十一&#xff09;&#xff0c;学习类&#xff0c;结构体&#xff0c;指针相关知识&#xff0c;准备好了吗&#xff1f;咱们开始咯~ 一、类与结构体 类的定义&#xff1a;在C中&#x…