选择语句通道示例

时间:2018-04-26 09:29:32

标签: select go concurrency channel

我是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")
   }    
}   

此时没有关于频道的解释。现在我不知道,如何触发另一个输出为&#34;没有通信&#34;。

任何人都可以为每个案例举个例子吗?

1 个答案:

答案 0 :(得分:0)

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

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

To&#34;触发&#34;另一种情况,你必须确保它的通讯。操作不会阻止。在该示例中,没有人从这些情况中使用的任何信道发送或接收任何信息。地狱,他们甚至没有初始化。并且nil频道的发送和接收都将永久阻止(有关详细信息,请参阅How does a non initialized channel behave?)。所以你应该这样做:初始化一个频道并发送到/接收它,你想要触发它的情况。例如:

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

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

received  1  from c1

Go Playground上试一试。 (注意:我将所有Printf()次来电更改为Println()。)

请注意,在其他goroutines上同时发送/接收来自频道的信息。为了简单起见,我选择了一个缓冲通道和相同的goroutine,因此即使在Go Playground上也能像你一样期待它。

有关频道的更多信息:What are golang channels used for?