我们可以在 Go 中使用 select 来接受来自不同侦听器的 Accept() 吗?

Can we use select to Accept() from different listeners in Go?

就像下面的代码:

for {
    select {
    case conn, err := listener1.Accept():
        if err != nil {
            log.Fatal(err)
        }
        go handleConn1(conn)
    case conn, err := listener2.Accept():
        if err != nil {
            log.Fatal(err)
        }
        go handleConn1(conn)
    }
}

虽然编辑告诉我 select

有问题

我们可以在 Go 中实现类似的东西吗?

select 仅适用于频道(在此处查看更多信息:https://gobyexample.com/select

在您的情况下,您可以跨越两个 goroutine,以便每个 goroutine 等待一个侦听器的 Accept 并处理连接:

go func() {
    for {
        conn, err := listener1.Accept():
        if err != nil {
            log.Fatal(err)
        }
        handleConn1(conn)
    }
}()
go func () {
    for {
        conn, err := listener2.Accept():
        if err != nil {
            log.Fatal(err)
        }
        handleConn2(conn)
    }
}()