请教一个 golang 的问题: 如何返回第一个连接

2018-01-01 02:15:29 +08:00
 recall704

详细问题是这样的: 我有两个一样的站点,分别为

  1. site1 := "www.aaa.com:80"
  2. site2 := "www.bbb.com:80"

一般创建一个连接是这样的:

conn, err := net.Dial("tcp", site1)

我想从站点获取数据,创建连接的时候,我想同时创建,但是谁先创建成功我就要谁。 就像我急着用某件物品,附近有两家超市,我安排两个人同时去买,买到了就行,而不用管是谁买到的。

func getBestConn()(net.Conn) {
    ch := make(net.Conn, 1)
    site1 := "www.aaa.com:80"
    site2 := "www.bbb.com:80"
    
    go func(){
        cc, err := net.Dial("tcp", site1)
        ch <- cc
    }()
    go func(){
        cc, err := net.Dial("tcp", site2)
        ch <- cc
    }()
    
    return <-cc
}

我写了上面的代码,但是它不能正常工作。 请问我该怎么做?

btw, 新年快乐

1366 次点击
所在节点    问与答
4 条回复
mlkr
2018-01-01 02:19:49 +08:00
snail1988
2018-01-01 10:42:37 +08:00
你的想法可以实现啊,不过你贴的代码有明显错误

```
func getBestConn()(net.Conn) {
ch := make(chan net.Conn, 1)
site1 := "www.baidu.com:80"
site2 := "www.taobao.com:80"
go func(){
cc, _ := net.Dial("tcp", site1)
ch <- cc
}()
go func(){
cc, _ := net.Dial("tcp", site2)
ch <- cc
}()
return <-ch
}
```
recall704
2018-01-01 12:25:54 +08:00
@snail1988 手写的,所以。。。
suconghou
2018-01-01 13:48:01 +08:00
无缓冲 chan,入的时候用 select 和 default,后入的会阻塞,走 default close

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/419089

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX