1 回答
TA贡献1829条经验 获得超6个赞
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)
以元素数量表示的容量设置通道中缓冲区的大小。如果容量为零或不存在,则通道是无缓冲的,只有当发送方和接收方都准备就绪时,通信才会成功。否则,如果缓冲区未满(发送)或不为空(接收),通道将被缓冲并且通信成功而不会阻塞。一个 nil 通道永远不会准备好进行通信。
在您的情况下,这取决于哪个 go 例程将首先在通道上发送值。您打印的值完全取决于 go 例程。
- 1 回答
- 0 关注
- 107 浏览
添加回答
举报