只需要第一个答案

未匹配的标注

最近小白结识了几位搜索圈的小伙伴, 度娘/谷哥/老必.

可算是给小白提供了不少帮助.

每当遇到各种萌萌哒的奇葩羞羞哒的来的问题时, 百思不得其解后.

小白都会同时请教度娘/谷哥/老必, 以求得最先得到的答案.

代码意思意思如下:

// 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 访问真实的网络.

小白表示看懂了, 但是还有更多的同类场景应用嘛?

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
taadis
讨论数量: 0
发起讨论 只看当前版本


暂无话题~