Select 语句通道示例

Select statement channel example

我是 golang 的新手,想了解 select 语句是如何工作的 https://www.tutorialspoint.com/go/go_select_statement.htm

package main

import "fmt"

func main() {
   var c1, c2, c3 chan int
   var i1, i2 int
   select {
      case i1 = <-c1:
         fmt.Printf("received ", i1, " from c1\n")
      case c2 <- i2:
         fmt.Printf("sent ", i2, " to c2\n")
      case i3, ok := (<-c3):  // same as: i3, ok := <-c3
         if ok {
            fmt.Printf("received ", i3, " from c3\n")
         } else {
            fmt.Printf("c3 is closed\n")
         }
      default:
         fmt.Printf("no communication\n")
   }    
}   

此时没有关于渠道的解释。现在我不知道如何触发另一个输出 "no communication".

任何人都可以给我每个案例的例子吗?

select 语句选择一个 case 其通信操作不会阻塞。如果有多个案例的通讯。 op不会阻塞,随机选择一个。

由于在示例中所有通信操作都会阻塞,并且由于提供了 default,因此将执行。

对于"trigger"另一种情况,你必须确保它的通信。 op 不会阻塞。在示例中,没有人从案例中使用的任何渠道发送或接收任何内容。见鬼,它们甚至都没有初始化。发送到 nil 频道和从 nil 频道接收永远阻塞(有关详细信息,请参阅 )。所以你应该这样做:初始化一个通道并发送到它/从它接收,你想要触发它的情况。例如:

c1 = make(chan int, 1)
c1 <- 1

此代码段使用缓冲区 1 初始化 c1 通道,并在其上发送一个值。所以在此之后的 select 语句中,通信操作 i1 = <-c1 不会阻塞,因此将选择它,输出将是:

received  1  from c1

Go Playground 上试试看。 (注意:我将所有 Printf() 调用更改为 Println()。)

请注意,在其他 goroutine 上,从通道发送/接收可能同时发生。为了简单起见,我选择了一个缓冲通道和相同的 goroutine,这样即使在 Go Playground 上它的行为也符合您的预期。

有关频道的更多信息: