只需要第一个答案
最近小白结识了几位搜索圈的小伙伴, 度娘/谷哥/老必.
可算是给小白提供了不少帮助.
每当遇到各种萌萌哒的奇葩羞羞哒的来的问题时, 百思不得其解后.
小白都会同时请教度娘/谷哥/老必, 以求得最先得到的答案.
代码意思意思如下:
// case6_test.go
package concurrent
import (
"testing"
"time"
)
func TestCall(t *testing.T) {
ch := make(chan string, 1)
go callBaidu(ch)
go callBing(ch)
go callGoogle(ch)
result := <-ch
t.Log(result)
}
func callBaidu(ch chan string) {
time.Sleep(time.Second)
ch <- "from baidu"
}
func callBing(ch chan string) {
time.Sleep(2 * time.Second)
ch <- "from bing"
}
func callGoogle(ch chan string) {
time.Sleep(3 * time.Second)
ch <- "from google"
}
简单起见, 我们这里假设
- 访问度娘需要 1 秒
- 访问老必需要 2 秒
- 访问谷哥需要 3 秒
声明了一个缓冲为 1 的字符串类型的信道
通过不同的协程同时对三者发起调用, 但只接收第一个返回的结果并输出.
执行测试
go test -v case6_test.go
不出意外的话, 输出如下:
=== RUN TestCall
--- PASS: TestCall (1.00s)
case6_test.go:14: from baidu
PASS
ok command-line-arguments 3.279s
通过输出可以看到只接收了最先返回的第一个结果.
可以把时间调整下或者通过 net/http
访问真实的网络.
小白表示看懂了, 但是还有更多的同类场景应用嘛?