为什么打印0?

问题描述 投票:0回答:1

我正在尝试并发,并且尝试了一些模式。 我正在尝试这样做,您收到一组元素,同时处理它们并对所有结果求和。 我使用 2 个通道,一个用于处理数组,另一个用于对结果求和。 为了同步这一点,我使用等待组来等待所有元素都被处理,然后关闭通道。 但令我惊讶的是,当这段代码打印出 0 时。 我是新手,但我不明白为什么它打印 0。 有人可以解释一下吗?

package main

import (
    "fmt"
    "sync"
)

func main() {
    input := []int{1, 2, 3, 4, 5}

    c := make(chan int)
    result := make(chan int)
    var wg sync.WaitGroup

    go process_all(input, c, &wg)
    go sum_results(c, result)

    wg.Wait()
    close(c)

    sum := <- result
    fmt.Println(sum)
}

func sum_results(c chan int, res chan int) {
    var sum int
    for result := range c {
        sum += result
    }
    res <- sum
}

func process_all(inputs []int, c chan int, wg *sync.WaitGroup) {
    wg.Add(len(inputs) + 1)
    defer wg.Done()
    for input := range inputs {
        go process_input(input, c, wg)
    }
}

func process_input(input int, c chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    c <- input * 2
}

我希望打印 20

go concurrency goroutine
1个回答
0
投票

我可以看到你的程序中有两个错误。首先,您在第一个 goroutine 中调用

wg.Add
,因此不能保证当您
wg.Wait
时它被调用,从而在添加任何内容之前关闭通道 c。其次,
inputs
上的范围给出了索引而不是切片中的值。

© www.soinside.com 2019 - 2024. All rights reserved.