选择语句频道示例



我是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 c1n")
      case c2 <- i2:
         fmt.Printf("sent ", i2, " to c2n")
      case i3, ok := (<-c3):  // same as: i3, ok := <-c3
         if ok {
            fmt.Printf("received ", i3, " from c3n")
         } else {
            fmt.Printf("c3 is closedn")
         }
      default:
         fmt.Printf("no communicationn")
   }    
}   

目前尚无关于渠道的解释。现在我不知道,如何将另一个输出触发为"无通信"。

任何人都可以给我一个例子吗?

select语句选择case,其通信不会阻止。如果有多种情况。OP不会阻塞,一个随机选择。

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

要"触发"另一种情况,您必须确保其通信。OP不会阻止。在示例中,没有人从案例中使用的任何渠道发送或接收任何东西。地狱,他们甚至没有初始化。并永远从nil通道块发送和接收(有关详细信息,请参见非初始化通道的表现?(。因此,您应该这样做:初始化一个频道并从中发送/接收,它是您要触发的情况。例如:

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

此片段以1个缓冲区为1初始化c1通道,并在其上发送一个值。因此,在此之后的select语句中,通信操作i1 = <-c1不会阻止,因此将选择这一点,并且输出将为:

received  1  from c1

在Go操场上尝试一下。(注意:我将所有Printf()调用更改为Println()。(

请注意,从通道发送/接收可能同时在其他goroutines上进行。我选择了一个缓冲的频道和同样的goroutine,以简单起见,因此即使在Go Playground上,它也会按照您的期望。

更多关于频道的信息:golang通道是用于什么?

最新更新