go语言并发编程:通道接收顺序的非直觉性
本文探讨Go语言并发编程中通道(channel)的接收顺序问题,解释为何其结果可能与预期不符。我们将通过分析示例代码,揭示其背后的机制。

这段代码展示了两个goroutine分别计算切片前半部分和后半部分的和,并将结果发送到同一个通道:
<code class="go">package main
import "fmt"
func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum
}
func main() {
a := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(a[:len(a)/2], c)
go sum(a[len(a)/2:], c)
x, y := <-c, <-c // 这里接收顺序可能与预期不同
fmt.Println(x, y)
}</code>代码中x, y := <-c, <-c语句的赋值顺序并非按照goroutine完成计算的顺序。这是因为Go语言的赋值运算符是右结合的。x, y := <-c, <-c等价于x, y := (<--c), (<--c)。哪个goroutine先完成计算并发送数据到通道,取决于goroutine的调度,这使得x和y的最终值无法预先确定。
立即学习“go语言免费学习笔记(深入)”;
因此,理解Go语言赋值运算符的结合性对于准确理解并发程序至关重要。如果需要确保接收顺序,则应考虑使用带缓冲的通道或其他同步机制,例如互斥锁等。
以上就是Go语言并发编程:通道接收顺序为何与直觉相反?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号