我需要从 一个channel中读取数据; 这个channel 我不能对他行为(如: 什么时候被close(),被取消)做出假设, 可以 range 读取(但是 总要判断 true 才能使用他返回的值,不爽!); for val := range myChan{ //用val 执行某些操作 } 可以使用 select 来包装 读操作如下: loop: for { select{ case <- done: break loop case maybeVal, ok := <- myChan: if ok == false{ return //这 或许从 for 循环中退出 } //用 val 执行某些操作 } } */ // 对 这种处理就很细致全面了,可以很好很强大的 控制读取chan了。 //完整代码如下:(封装成 函数)
var orDone = func(done, c<- chan interface{}) <- chan interface{} {
valStream := make(chan interface{})
go func() {
defer close(valStream)
for{
select {
case <-done :
return
case v, ok := <-c:
if ok == false{
return
}
select{
case valStream <- v:
case <-done:
}
}
}
}()
return valStream
}
使用 orDone ; 我又可以 回到简单的循环了 如下: for val := range orDone(done, myChan){ //用 val 执行某些操作。 }