【问题标题】:Which channel type should be used when the message is never evaluated?当消息从未被评估时,应该使用哪种通道类型?
【发布时间】:2019-02-02 19:45:17
【问题描述】:

通过下面的选择语句,我想确保一些非阻塞函数只被一个一个地执行:

select {
case <-available:
default:
    fmt.Println("busy")
    return
}
go func() {
    defer func() { available <- true }()
    doSomethingOneByOne()
}()

目前我使用bool 作为频道类型,它按预期工作。

我不喜欢的是,使用bool 表明值是truefalse 很重要。但实际上在这种情况下并不重要。在我看来,这会使代码更难理解,因为它具有误导性。

当值无关紧要时,是否有使用哪种类型的约定?

【问题讨论】:

  • 使用空结构。
  • 只要不评估从通道中获取的值,我看不出有问题。你可以使用 Godoc/cmets。

标签: go


【解决方案1】:

chan struct{} 是一个有效的选择——struct{} 是一个有效的类型,但是这个类型的值 contains no data and has zero size 和所有的 struct{} 值是无法区分的,使它成为 Go 的 unit type。要构造 struct{} 类型的值以在通道上发送,您可以使用文字 struct{}{}

【讨论】:

  • 我经常最终定义 type Sentinel struct{}var Nothing = Sentinel{} 只是为了保持代码可读性,因为到处都有 struct{}{} 对我来说看起来很乱。
猜你喜欢
  • 2017-06-10
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 2016-12-16
相关资源
最近更新 更多