谁帮我解释一下 这个return 会返回几个结果? 也就是调用Query的时候会得到几个Result

func Query(conns []Conn, query string) Result {
    ch := make(chan Result, len(conns))  // buffered
    for _, conn := range conns {
        go func(c Conn) {
            ch <- c.DoQuery(query):
        }(conn)
    }
    return <-ch
}

我想应该会得到所有的,但是这应该怎么解释呢?

共 5 个回复


beerspume

返回一个结果。 一般情况下只返回第一个c.DoQuery的结果,而其他的不会返回。而是放到chan的buffer中,遗憾的是方法退出后chan将不再可见,里面的内容也没了。

# 0

xzgyb

我觉得这个例子前面已经说明了

We have a replicated database and want to minimize latency by asking them all and

returning the first response to arrive

也就是说对已经连接的各replicated database同时查询,并返回第一个查询到的结果,至于其他的结果, 因为都是从replicated database获取的,都是相同的,进行丢弃。

目的就是哪个conn的查询,执行的快,就返回哪个结果。

至于ch 为什么要用buffer的,我的理解是,如果不用buffer的,对于除了第一个返回结果的goroutine外,其他的goroutine将 一直堵塞在ch中,goroutine的所占用的资源将得不到释放。

# 2

shaovie

哦。大意了,没注意前边的英文解释。@xzgyb 多谢

# 3

xzgyb

@shaovie, 呵,不客气!

# 4