Go 并发模式——这会留下挂起的 goroutines 吗?

Go Concurrency Pattern- will this leave hanging goroutines?

以 Rob Pike 的 Google IO talk on Go Concurrency Patterns, he presented this code 为例,说明如何从多个副本服务器中挑选最快的响应者:

func First(query string, replicas ...Search) Result {
    c := make(chan Result)
    searchReplica := func(i int) { c <- replicas[i](query) }
    for i := range replicas {
        go searchReplica(i)
    }
    return <-c
}

问题:这不会导致 N-1 个副本 goroutine 在通道写入时阻塞吗?

在演讲后的讨论中,一位听众似乎在问这个问题,但得到了一种得心应手的回答。

我倾向于将第 3 行更改为如下内容:

searchReplica := func(i int) {
   select {
      case c <- replicas[i](query):
      default: // non-blocking write
 }
}

你是对的。但这不适合一张幻灯片。他说的是并发模式,不一定是代码。

当然,我还是不会把代码放到幻灯片上...