我对 Go 中缓冲通道和无缓冲通道之间的区别有点困惑。例如,下面的代码执行良好:
package main
import "fmt"
func main() {
messages := make(chan string)
go func() { messages <- "ping" }()
msg := <-messages
fmt.Println(msg)
}
另一方面,当我"ping"在常规函数中传递消息时,会出现死锁。
package main
import "fmt"
func main() {
messages := make(chan string)
func() { messages <- "ping" }()
msg := <-messages
fmt.Println(msg)
}
最后,当我使用缓冲通道时,这是固定的,就像这样
package main
import "fmt"
func main() {
messages := make(chan string, 1)
func() { messages <- "ping" }()
msg := <-messages
fmt.Println(msg)
}
我很困惑为什么第二个案例失败了。Go By Example 说
默认情况下,通道是无缓冲的,这意味着如果有相应的接收 (<- chan) 准备好接收发送的值,它们将只接受发送 (chan <-)。缓冲通道接受有限数量的值,而这些值没有相应的接收器。
msg在所有三种情况下,水槽不是用于messages吗?
呼啦一阵风
宝慕林4294392
忽然笑
相关分类