我想知道在大猩猩里等候更好的方式是time.Sleep()还是<-time.After()?这两者有什么不同,如何做出 Select ?谢谢.

推荐答案

我认为这对大多数项目来说并不重要.已经有question on golang-nuts about this个了,但我认为没有人能得出任何结论.

在实践中,After在已经需要在多个频道上select,但也想要超时的情况下是有用的:

select {
case c := <-someChan:
  ..
case c := <-otherChan:
  ..
case <-time.After(time.Second * 42):
}

从表面上看,代码Sleep似乎更简单,而After构建了一个新的计时器,带有一个句点、一个结束符来发送完成的时间等.

再说一次,我认为这在实践中无关紧要,但time.Sleep看起来很容易读,所以我会 Select 它.


在我的实现中,它们执行完全相同的系统调用,并最终等待:

futex(??, FUTEX_WAIT, 0, {41, 999892351}
                          ^^ 41 seconds and change

Go相关问答推荐

ChromeDriver不存在(高朗selenium)

使用Go使用Gorm使用外键对数据进行排序

是不是有什么原因导致`Strings.EqualFold`不先进行长度比较?

如何模拟go的Elastic search SDK?

Golang和Gin web框架在router.Run()之后执行代码

Exchange Web 服务 - 使用 soap xml 请求查找所有未读邮件

使用 Go Colly 抓取所有可能的标签并将它们放入一个变量中

动态 SQL 集 Golang

致命错误:找不到由 zergon321/reisen 引起的libavcodec/avcodec.h文件

不能在 *gorm.db 而不是 gorm.db 上使用 WithContext(ctx) 方法

为什么 Go 被认为是部分抢占式的?

如何使用struct的方法清除除某些字段之外的struct值

如何使用 Status 字段创建 Kubernetes 对象?

使用 Go 读取 TOML 文件时结果为空

如何从 tinygo webassembly 目标返回对象

HCL 解码:具有多个标签的块

如何在 Go 中使用 Pact 返回错误请求(400、500)?

Dynamodb.ScanInput - 不能使用expr.Names()(类型 map[string]*string)作为类型 map[string]string

AWS EKS 上的 Golang REST API 部署因 CrashLoopBackOff 而失败

Golang LinkedList 删除第一个元素