最近在学习golang,记一次goroutine传参引发的计算结果和预期不一致问题。
例子是一个多goroutine并行计算一个数的值,一个task的chan,和一个result的chan用来存储分配的每个任务,和每个任务的计算结果,最后将所有的任务结果相加
先看有问题的代码:
package main
import (
"fmt"
"sync"
)
//利用chan将计算任务拆分成多个task,并发计算
type task struct {
begin int
end int
result chan int
}
func (t *task) do() {
sum := 0
for i := t.begin; i <= t.end; i++ {
sum = sum + i
}
fmt.Printf("this sum is %d\n", sum)
t.result <- sum
}
//分配task,将总的任务分割
func InitTask(taskchan chan task, r chan int, count int) {
//10个任务,每个任务的数目
cp := count / 10
//余数
du := count % 10
high := du + cp*10
for j := 0; j < 10; j

本文记录了在学习Golang过程中遇到的一个关于goroutine传参导致计算结果错误的问题。通过分析代码和日志,发现由于在并发环境下,同一个结构体变量在不同goroutine中被修改,导致结果不一致。解决办法是在启动goroutine时显式传递结构体副本,确保每个goroutine拥有独立的参数,从而得到正确结果。
最低0.47元/天 解锁文章
175

被折叠的 条评论
为什么被折叠?



