For loop 为什么我的'for select'语句即使在我关闭频道后仍从频道接收到消息?

For loop 为什么我的'for select'语句即使在我关闭频道后仍从频道接收到消息?,for-loop,go,channel,For Loop,Go,Channel,我有以下代码: package main import ( "fmt" "time" ) func main() { ch := make(chan int) ch2 := make(chan int) go func(c chan int, c2 chan int) { for { select { case v := <-c: fmt.Printl

我有以下代码:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)
    ch2 := make(chan int)
    go func(c chan int, c2 chan int) {
        for {
            select {
            case v := <-c:
                fmt.Println(v)
            case v := <-c2:
                fmt.Println(v)
            default:
            }
        }
    }(ch, ch2)
    ch <- 1
    close(ch)
    close(ch2)
    time.Sleep(10 * time.Second)
}
主程序包
进口(
“fmt”
“时间”
)
func main(){
ch:=制造(成交量)
ch2:=制造(成交量)
go func(c通道内部,c2通道内部){
为了{
挑选{

案例五:=这是每个人的预期行为

通道上的接收操作始终可以立即进行,在接收到之前发送的任何值后生成元素类型

如果要在从通道接收到所有值(在关闭通道之前发送的值)后终止循环,请使用
for…range
构造,例如:

c := make(chan int) // Initialize some channel

for v := range c {
    fmt.Println("Received:", v)
}
如果您有多个频道并且希望从所有频道接收,您可以使用多个goroutine,每个goroutine都有一个
用于指定频道的范围

另一个解决办法是:

通过将输入通道多路复用到一个通道上,一个函数可以读取多个输入并继续执行,直到所有输入都关闭。当所有输入都关闭时,该通道将关闭。这称为扇入

请在中阅读更多关于它的信息

n

在调用close之后,以及在之前发送的任何值被 received,receive操作将返回 没有阻塞的通道类型

封闭通道上的接收操作始终可以继续 立即,在任何 已收到以前发送的值


因此,假设我想在所有通道关闭后退出goroutine,这可能吗?我假设一旦所有通道关闭,在默认情况下,我可以在所有通道关闭后退出goroutineclosed@AyushGupta只需将
用于…范围
,一旦接收到所有值并关闭通道,该范围即终止如果我想同时从多个频道接收,那么这篇博文对关闭频道上的选择以及如何利用零频道的主题非常有启发性:@colminator感谢链接!我会查看它。为什么会有反对票?