gpt4 book ai didi

选择语句 channel 示例

转载 作者:数据小太阳 更新时间:2023-10-29 03:47:16 25 4
gpt4 key购买 nike

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

此时没有关于 channel 的解释。现在我不知道如何将另一个输出触发为“无通信”。

任何人都可以给我每个案例的例子吗?

最佳答案

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

因为在这个例子中所有的通信操作都会被阻塞,并且因为 default提供,将被执行。

要“触发”另一个案例,您必须确保它的通信。 op 不会阻塞。在示例中,没有人从案例中使用的任何 channel 发送或接收任何内容。见鬼,它们甚至都没有初始化。发送和接收自 nil channel 永远阻塞(有关详细信息,请参阅 How does a non initialized channel behave? )。所以你应该这样做:初始化一个 channel 并发送到它/从它接收,你想要触发它的情况。例如:

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

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

received  1  from c1

Go Playground 上试试. (注意:我将所有 Printf() 调用更改为 Println() 。)

请注意,在其他 goroutine 上,从 channel 发送/接收可能同时发生。为了简单起见,我选择了一个缓冲 channel 和相同的 goroutine,这样即使在 Go Playground 上它的行为也符合您的预期。

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

关于选择语句 channel 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50039483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com