go - 如果任何 channel 关闭,有没有办法中断选择?

标签 go

假设我们在两个 channel 上进行选择。运行几次后,其中一个 channel 关闭。我怎样才能跳出选择?

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int)
    closed := make(chan bool, 1)
    go func() {
        for i := 0; i < 5; i++ {
            ch <- 1
        }
        close(ch)
    }()

    for {
        select {
        case v := <-ch:
            fmt.Printf("v is %v\n", v)
        case <-closed:
            fmt.Println("The server is closed!")
            return
        }
    }
    fmt.Println("Break!")
}

无限阻塞。如何让它发挥作用?

最佳答案

如果 channel 说没有更多项目,您可以返回:

    case v, more := <-ch:
        if !more {
            return
        }
        fmt.Printf("v is %v\n", v)

关于go - 如果任何 channel 关闭,有没有办法中断选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47199365/

相关文章:

json - 是否可以动态设置 json.Unmarshal 的输出?

go - 如何正确执行多个并发请求?

go - WaitGroup 和同步在 Go 中不起作用

pointers - Nil指针取消引用尝试将指针复制到指针

go - 仔细检查 Go 的 select 语句

go - 遍历 Go 中结构的字段

unit-testing - Go 应用程序在测试包含锁的函数时挂起

multithreading - App Engine Channel API 的线程安全/原子性

go - 函数超时和 goroutine 泄漏

postgresql - 节省时间。golang 中的时间到带有时区字段的 postgres 时间戳