其他案例调用的golang案例不执行但返回

Jib*_*iru 0 go

为什么不Stopped打印出来,main而是返回?

package main

import (
    "fmt"
    "time"
)

func main() {
    tick := time.Tick(100 * time.Millisecond)
    boom := time.After(500 * time.Millisecond)
    var stop chan int = make(chan int)
    for {
        select {
        case <- stop:
            fmt.Println("Stopped!")
        case <-tick:
            fmt.Println("tick.")
        case <-boom:
            fmt.Println("BOOM!")
            stop <- 0
        default:
            fmt.Println("    .")
            time.Sleep(50 * time.Millisecond)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

   .
    .
tick.
    .
    .
tick.
    .
    .
tick.
    .
    .
tick.
    .
    .
tick.
BOOM!
Run Code Online (Sandbox Code Playgroud)

预计:

   .
    .
tick.
    .
    .
tick.
    .
    .
tick.
    .
    .
tick.
    .
    .
tick.
BOOM!
Stopped!
Run Code Online (Sandbox Code Playgroud)

Bri*_*its 5

在围棋编程语言规范说,大约发送到通道的情况如下:

通信阻塞,直到发送可以继续。如果接收器准备好,则可以继续在无缓冲通道上发送。如果缓冲区中有空间,则可以继续在缓冲通道上发送。

因此,当您的代码到达stop <- 0它时,它会阻塞等待另一个 goroutine 从通道读取,而这永远不会发生(您case <- stop:在同一个 goroutine 中,因此未处于活动状态)。

有几种方法可以解决这个问题:

  1. 使用缓冲通道(例如stop := make(chan int, 1))。
  2. 等待另一个 go 例程中的停止(示例)
  3. 关闭通道而不是向它发送一些东西 ( close(stop))。

注意:由于您的应用程序的编写方式,这些选项实际上都不会停止它,因为您的 for 循环永远不会退出(添加break或return退出)。