我见过的所有实施例迄今涉及阻断得到结果(经由<-chan操作符)。

我的当前方法包括将指针传递到一个结构:

type goresult struct {
    result resultType;
    finished bool;
}

其中够程完成时写入。然后,它检查finished只要方便简单的事情。你有更好的方法?

我真正的目标是向Qt信号槽系统。我有一种预感,该解决方案将看起来几乎微不足道(chans有大量未开发的潜力的),但我还没有足够熟悉的语言来弄明白。

有帮助吗?

解决方案

您可以使用“逗号,OK”的格局(见“有效去他们的网页“):

foo     := <- ch; // This blocks.
foo, ok := <- ch; // This returns immediately.

其他提示

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
    }
    }
}
  

对于所有的发送和接收   在“选择”语句表达,   信道表达式进行求值,   伴随着出现的任何表情   在发送的右侧   表情,由上到下的顺序。   如果任何导致操作都可以   继续进行,一个被选择和   相应的通信和   报表进行评估。除此以外,   如果有一个默认的情况下,   执行;如果没有,语句块   直到通信中的一个可以   完整。

您还可以偷看通道缓冲器以查看它是否包含任何通过使用LEN:

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

这不会接触到通道缓冲器,不同于foo, gotValue := <- ch其去除的值时gotValue == true

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top