9

到目前为止,我看到的所有示例都涉及阻塞以获取结果(通过<-chan操作员)。

我目前的方法涉及将指针传递给结构:

type goresult struct {
    result resultType;
    finished bool;
}

goroutine 在完成时写入的内容。finished然后在方便的时候进行检查是一件简单的事情。你有更好的选择吗?

我真正的目标是 Qt 风格的信号槽系统。我有一种预感,解决方案看起来几乎是微不足道的(chans 有很多未开发的潜力),但我对语言还不够熟悉,无法弄清楚。

4

3 回答 3

13

您可以使用“comma, ok”模式(参见他们关于“有效 go ”的页面):

foo     := <- ch; // This blocks.
foo, ok := <- ch; // This returns immediately.
于 2009-11-13T19:49:36.827 回答
5

Select 语句允许您一次检查多个通道,采用随机分支(通信等待的分支):

func main () {
    for {
    select {
        case w := <- workchan:
            go do_work(w)
        case <- signalchan:
            return
        // default works here if no communication is available
        default:
            // do idle work
    }
    }
}

对于“select”语句中的所有发送和接收表达式,通道表达式以及出现在发送表达式右侧的任何表达式都按从上到下的顺序进行计算。如果任何结果操作可以继续,则选择一个并评估相应的通信和语句。否则,如果存在默认情况,则执行;如果不是,则语句​​阻塞,直到其中一个通信可以完成。

于 2009-11-13T18:20:00.727 回答
5

您还可以使用 len 查看通道缓冲区以查看它是否包含任何内容:

if len(channel) > 0 {
  // has data to receive
}

这不会触及通道缓冲区,不像foo, gotValue := <- chgotValue == true.

于 2009-11-14T13:23:23.920 回答