golang使用范围从通道读取超时读数

golang使用范围从通道读取超时读数,go,timeout,channel,Go,Timeout,Channel,我的代码如下所示: outChannel := make(chan struct{}) ... for out := range outChannel { ... } 我有一个制作人正在向outChannel写入数据,并希望在读取数据时超时(如果整个处理过程需要XX秒以上)。 这样做的正确方式是什么 我只看到过使用select从通道读取多个cases的构造(在:),但是,一旦使用range,这似乎不适用。您想做类似的事情,但对整个循环使用单个超时通道: const timeout = 3

我的代码如下所示:

outChannel := make(chan struct{})
...
for out := range outChannel {
   ...
}
我有一个制作人正在向
outChannel
写入数据,并希望在读取数据时超时(如果整个处理过程需要XX秒以上)。 这样做的正确方式是什么


我只看到过使用
select
从通道读取多个
case
s的构造(在:),但是,一旦使用
range
,这似乎不适用。您想做类似的事情,但对整个循环使用单个超时通道:

const timeout = 30 * time.Second
outc := make(chan struct{})
timec := time.After(timeout)

RangeLoop:
for {
    select {
    case <-timec:
        break RangeLoop // timed out
    case out, ok := <-outc:
        if !ok {
            break RangeLoop // Channel closed
        }
        // do something with out
    }
}
const timeout=30*时间秒
outc:=make(chan结构{})
timec:=时间之后(超时)
范围循环:
为了{
挑选{

如果
break
仅从
select
中断。您需要一个标签或一个返回来从for循环中断。谢谢,我写得太快了。我添加了一个标签,但我想通常这会在func中,返回的可读性会更好。