我们可以在Go中使用select来从不同的监听器中接受连接吗?

huangapple go评论104阅读模式
英文:

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

问题

就像以下代码一样:

  1. for {
  2. select {
  3. case conn, err := listener1.Accept():
  4. if err != nil {
  5. log.Fatal(err)
  6. }
  7. go handleConn1(conn)
  8. case conn, err := listener2.Accept():
  9. if err != nil {
  10. log.Fatal(err)
  11. }
  12. go handleConn1(conn)
  13. }
  14. }

当编辑器告诉我select有问题时,我们能在Go中实现类似这样的代码吗?

英文:

Just as the following codes:

  1. for {
  2. select {
  3. case conn, err := listener1.Accept():
  4. if err != nil {
  5. log.Fatal(err)
  6. }
  7. go handleConn1(conn)
  8. case conn, err := listener2.Accept():
  9. if err != nil {
  10. log.Fatal(err)
  11. }
  12. go handleConn1(conn)
  13. }
  14. }

While the editor tells me something wrong with select

Can we implement something like this in Go?

答案1

得分: 1

select只能用于通道(在这里了解更多:https://gobyexample.com/select)

在你的情况下,你可以创建两个goroutine,每个goroutine等待一个监听器的Accept并处理连接:

  1. go func() {
  2. for {
  3. conn, err := listener1.Accept()
  4. if err != nil {
  5. log.Fatal(err)
  6. }
  7. handleConn1(conn)
  8. }
  9. }()
  10. go func() {
  11. for {
  12. conn, err := listener2.Accept()
  13. if err != nil {
  14. log.Fatal(err)
  15. }
  16. handleConn2(conn)
  17. }
  18. }()
英文:

select only works with channels (see more here: https://gobyexample.com/select)

In your case, you could span two goroutines so that each of them waits for the Accept of one listener and processes the connection:

  1. go func() {
  2. for {
  3. conn, err := listener1.Accept():
  4. if err != nil {
  5. log.Fatal(err)
  6. }
  7. handleConn1(conn)
  8. }
  9. }()
  10. go func () {
  11. for {
  12. conn, err := listener2.Accept():
  13. if err != nil {
  14. log.Fatal(err)
  15. }
  16. handleConn2(conn)
  17. }
  18. }()

huangapple
  • 本文由 发表于 2017年9月10日 16:50:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/46138902.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定