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 上它的行为也符合您的预期。
有关频道的更多信息:
我是 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 上它的行为也符合您的预期。
有关频道的更多信息: