您的代码意图是通过两个 goroutine 来计算输入切片中奇数和偶数的总和。然而,在代码的逻辑上存在一些问题,导致程序不会如预期执行。
问题分析:
奇数和偶数判断:在
evenSum
和oddSum
的计算过程中使用了% 1 == 0
和% 1 == 1
。这实际上是错误的,应该分别用% 2 == 0
(偶数)和% 2 != 0
(奇数)。通道控制:初始时只向
evenChannel
发送信号,并且每次进行一个循环后会自动发送到另一个通道。由于不当的条件判断可能导致某一方无法正常运行,造成死锁。无穷循环问题:如果
index >= len(input)
的情况下没有及时退出,会导致 goroutine 持续等待而卡住。
以下是修正后的代码示例:
package main
import (
"fmt"
"sync"
)
func main() {
input := []int{1, 2, 3, 4, 4, 5, 5, 5, 6, 4, 3, 2}
index := 0
oddChannel := make(chan struct{})
evenChannel := make(chan struct{})
var oddSum, evenSum int
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
defer wg.Done()
for {
<-evenChannel
for index < len(input) && input[index]%2 == 0 { // 检查偶数
evenSum += input[index]
index++
}
if index >= len(input) {
break
}
oddChannel <- struct{}{}
}
}()
go func() {
defer wg.Done()
for {
<-oddChannel
for index < len(input) && input[index]%2 != 0 { // 检查奇数
oddSum += input[index]
index++
}
if index >= len(input) {
break
}
evenChannel <- struct{}{}
}
}()
evenChannel <- struct{}{} // 启动第一个goroutine处理偶数
wg.Wait()
fmt.Println("Odd Sum:", oddSum)
fmt.Println("Even Sum:", evenSum)
}
修正点:
- 使用
%2 ==0
来检查偶数,而用%2 !=0
来检查奇数。 - 每个 goroutine 会在条件不满足时提前终止,避免了无穷循环的问题。
运行该代码后,它将正确地输出输入数组中奇数和偶数的总和。
内容由零声教学AI助手提供,问题来源于学员提问