我创建了一个频道,并希望在不使用接收值的情况下将其释放。 但是,编译器不允许我编写这样的代码:
for i := range ch {
// code
}
抱怨我未被使用
代替_代替我没有工作
这样做的惯用方法是什么?
答案 0 :(得分:2)
您可以使用select
代替range
:
for {
select {
// read and discard
case <-ch:
// to avoid deadlock
default:
continue
}
}
但话又说回来,如果你不从中读取,你确定你真的需要这个频道吗?
答案 1 :(得分:2)
尝试this:
package main
import (
"fmt"
)
func main() {
ch := make(chan int)
close(ch)
for range ch {
fmt.Println("for")
}
fmt.Println("done")
}
输出:
done
答案 2 :(得分:0)
如果你不想陷入无限循环读取值,直到频道不为空:
exitLoop:
for {
select {
case <-ch:
default:
break exitLoop
}
}
演示:https://play.golang.org/p/UsIqdoAGZi
如果您需要&#34;可更新频道&#34; - 只保留最后一个值,您可以使用此配方 - https://stackoverflow.com/a/47107654/5165332