我是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;。
任何人都可以为每个案例举个例子吗?
答案 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?