go语言为什么我的程序不会执行子协程?

Python015

go语言为什么我的程序不会执行子协程?,第1张

go的main方法理解为入口函数,程序只执行这一个函数。整个项目由这个函数调度使用。

所以你的协程没有被运行。

你将协程函数命名,在main函数中调用 go test()即可

携程企业微信退出首先打开微信界面,看到下方一排图标,找到并点击通讯录。找到你想要退出的企业微信,点击进入。点击页面右上角的「+」图标,进入企业设置页面。继续点击右上角「___」图标,会弹出选项,选择「不再关注」选项,就可以顺利的退出该企业微信了。

微信在我们日常生活中使用非常频繁,可以说,已经成为我们生命的一部分。随着微信的更新换代,越来越多的功能被开发出来,企业微信便是其中非常使用的一种功能。2019年12月23日,企业微信3.0版本上线,正式连接微信生态,优化效率工具。

2020年2月,企业微信发布新版本,更新群直播、收集表、在线会议、在线问诊、紧急通知、疫情专区等六项能力。

2020年9月,企业微信海外版更名为 “WeCom”。

2020年12月23日,企业真实企业数突破550万;活跃用户数突破1.3亿;触达微信用户4亿人。而数据的背后是企业微信的伙伴生态正在崛起:540 个开放接口;80000 家合作伙伴;企业接入系统总数1191万。

golang在1.6.2的时候还没有自己的context,在1.7的版本中就把golang.org/x/net/context包被加入到了官方的库中。中文译作“上下文”,它主要包含了goroutine 的运行状态、环境等信息。

context 主要用来在 goroutine 之间传递上下文信息,包括:同步信号、超时时间、截止时间、请求相关值等。

该接口定义了四个需要实现的方法:

如果有个网络请求Request,然后这个请求又可以开启多个goroutine做一些事情,当这个网络请求出现异常和超时时,这个请求结束了,这时候就可以通过context来跟踪这些goroutine,并且通过Context来取消他们,然后系统才可回收所占用的资源。

为了更方便的创建Context,包里头定义了Background来作为所有Context的根,它是一个emptyCtx的实例。

Background返回一个非空的Context。它永远不会被取消。它通常用来初始化和测试使用,作为一个顶层的context,也就是说一般我们创建的context都是基于Background。

TODO返回一个非空的Context。当不清楚要使用哪个上下文的时候可以使用TODO。

他们两个本质上都是emptyCtx结构体类型,是一个不可取消,没有设置截止时间,没有携带任何值的Context。

有了如上的根Context,那么是如何衍生更多的子Context的呢?这就要靠context包为我们提供的With系列的函数了。

通过这些函数,就创建了一颗Context树,树的每个节点都可以有任意多个子节点,节点层级可以有任意多个。

WithCancel函数,最常用的派生 context 方法。该方法接受一个父 context。父 context 可以是一个 background context 或其他 context。

WithDeadline函数,该方法会创建一个带有 deadline 的 context。当 deadline 到期后,该 context 以及该 context 的可能子 context 会受到 cancel 通知。另外,如果 deadline 前调用 cancelFunc 则会提前发送取消通知。

WithTimeout和WithDeadline基本上一样,这个表示是超时自动取消,是多少时间后自动取消Context的意思。

WithValue函数和取消Context无关,它是为了生成一个绑定了一个键值对数据的Context,这个绑定的数据可以通过Context.Value方法访问到,一般我们想要通过上下文来传递数据时,可以通过这个方法,如我们需要tarce追踪系统调用栈的时候。

使用Context的程序应遵循以下规则,以使各个包之间的接口保持一致:

1.不要将 Context 塞到结构体里。直接将 Context 类型作为函数的第一参数,而且一般都命名为 ctx。

2.不要向函数传入一个 nil 的 context,如果你实在不知道传什么,标准库给你准备好了一个 context:todo。

3.不要把本应该作为函数参数的类型塞到 context 中,context 存储的应该是一些共同的数据。例如:登陆的 session、cookie 等。

4.同一个 context 可能会被传递到多个 goroutine,别担心,context 是并发安全的。