17

我在 select 语句中有一个默认原因,我什么都不想做,继续,但是将行留空会阻止语句中的任何事情发生

        select {
        case quit_status := <-quit:
            if quit_status == true {
                fmt.Printf("********************* GOROUTINE [%d] Received QUIT MSG\n", id)
                return
            }
        default:
            fmt.Printf("GOROUTINE [%d] step: %d, NO QUIT MSG\n", id, i)
        }
4

2 回答 2

10

语句中的defaultcaseselect旨在为通道读取和写入提供非阻塞 I/O。default只要任何案例中的任何通道都没有准备好读取/写入,就会执行案例中的代码。

因此,在您的情况下,default如果退出通道无话可说,则会执行该块。您可以简单地删除默认案例,它会阻止quit_status := <-quit案例,直到 .. 中的值可用,quit这可能是您在这种情况下所追求的。

如果你想在 select 语句之后立即继续执行代码,你应该在一个单独的 goroutine 中运行这个 select 语句:

go func() {
    select {
    case quit_status := <-quit:
        ...

    }
}()

// Execution continues here immediately.
于 2012-09-17T02:00:28.410 回答
3

正如@StephenWeinberg 指出的那样,go 中没有 pass 语句。当频道击中某些东西时,只需在案例中放置任何内容。

select {
    case <-ch:
        // do something
    case <-time.After(2*time.Second):
        // timeout
    default:
        // do nothing aka pass
}
于 2020-12-08T10:29:15.867 回答