php小编小新在go语言中,通道是一种用于在goroutine之间传递数据的机制。通道的行为取决于消息发送到它的方式。当通道被声明为有缓冲的时候,发送消息的goroutine会将消息放入通道的缓冲区,然后继续执行。而当通道被声明为无缓冲的时候,发送消息的goroutine会阻塞,直到有其他goroutine从通道中接收消息。因此,可以说通道的行为会根据消息发送到它的方式而改变。
为什么这两段代码的执行方式不同?
func main() { ch := make(chan int) ch <- 1 fmt.println(<-ch) }
ch := make(chan int) go buffer(ch) fmt.Println(<-ch) fmt.Println(<-ch) } func buffer(ch chan int) { ch <- 2 ch <- 3 }
仅当 ch 被定义为缓冲通道时,#1 才能正确执行。为什么?为什么 buffer() 中的 ch 接受 2 个值而不抱怨?
对无缓冲通道的发送操作将阻塞,直到另一个 goroutine 从中读取数据。这就是第一段代码死锁的原因:当您发送到通道时,没有其他 goroutine 从中读取。
在第二种情况下,您有一个 goroutine 向通道发送两个值,并且主 goroutine 在发送的同时从通道读取两次。该通道不接受两次发送,而是一个接一个地进行,第一个发送操作由第一次读取解除阻塞,第二个发送操作由第二次读取解除阻塞。
以上就是go 通道的行为是否会根据消息发送到它的方式而改变?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号