我是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通道是用于什么?