我想知道戈朗通道中元素的顺序。在运行了几个示例之后,元素离开通道的顺序似乎是"后进先出"。我说的对吗?
以下代码片段是我使用的示例。运行代码后,输出为 20 10,而 10 首先发送到通道,最后发送到 20。
package main
import "fmt"
func multiply(c chan int, num int) {
c <- num * 10
}
func main() {
c := make(chan int)
go multiply(c, 1)
go multiply(c, 2)
v1 := <-c
v2 := <-c
fmt.Println(v1, v2)
}
Golang 通道不是 LIFO。
通道充当先进先出队列。例如,如果一个 goroutine 在一个通道上发送值,第二个 goroutine 接收 它们,值按发送顺序接收。
只要通道的接收器准备就绪,就会收到通道上发送的值。如果没有,那么它将阻止。为了管理它,你可以选择缓冲通道。
下面的代码将检查是否可以从频道接收值。
package main
import "fmt"
func multiply(c chan int, num int) {
c <- num * 10
}
func main() {
c := make(chan int, 3)
go multiply(c, 1)
go multiply(c, 2)
go multiply(c, 3)
for i:=0;i<3;i++{
foo, ok := <- c
if !ok {
fmt.Println("done")
return
}
fmt.Println(foo)
}
}
围棋操场上的工作代码
缓冲通道
通道可以缓冲。提供缓冲区长度作为初始化缓冲通道的第二个参数:
make(chan int, 100)
容量(以元素数为单位(设置缓冲区的大小 通道。如果容量为零或不存在,则通道为 未缓冲,仅当发送方和 接收器已准备就绪。否则,通道将被缓冲并 如果缓冲区未满,通信成功而不阻塞 (发送(或不为空(接收(。零通道永远不会准备好 通信。
在您的情况下,这取决于哪个 go 例程将首先在通道上发送值。要打印的值完全取决于 go 例程。
欲了解更多信息,请访问 Golang 频道