Golang中如何从goroutine返回结果

Golang中如何从goroutine返回结果 我创建了一个简单计算切片中数字总和的函数。尝试通过通道来实现功能,但不确定如何从主函数中获取函数的计算结果并输出。

func main() {
    s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    c := make(chan int)
    go sum(s, c)
    // 如何从这里获取结果?
}

func sum(s []int, c chan int) {
    sum := 0
    for _, v := range s {
        sum += v
    }
    c <- sum
}

更多关于Golang中如何从goroutine返回结果的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

非常感谢您的帮助以及关于更好标题的建议。真的很有帮助

更多关于Golang中如何从goroutine返回结果的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


main 函数需要创建通道,将其作为参数传递给 sum 函数,然后从中读取单个值。

package main

import (
	"fmt"
)

func main() {
	c := make(chan int)
	x := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}

    // 将数据和返回通道传递给 goroutine
	go sum(x, c)

    // 从通道读取单个值
	fmt.Println(<-c)
}

func sum(x []int, c chan<- int) {
	total := 0
	for _, v := range x {
		total += v
	}

    // 将结果写入从 main 函数获取的通道
	c <- total
}

查看 https://play.golang.org/p/iIn3rdk92nj

在Go语言中,可以通过从通道接收数据来获取goroutine的计算结果。使用<-c操作符从通道读取数据,这会阻塞主goroutine直到sum函数发送结果到通道。

func main() {
    s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    c := make(chan int)
    go sum(s, c)
    
    // 从通道接收结果
    result := <-c
    fmt.Println("Sum:", result) // 输出: Sum: 45
}

func sum(s []int, c chan int) {
    sum := 0
    for _, v := range s {
        sum += v
    }
    c <- sum
}

对于更复杂的场景,可以使用带缓冲的通道或select语句来处理多个goroutine的结果:

func main() {
    numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    c := make(chan int, 1) // 带缓冲的通道
    
    go sum(numbers, c)
    
    result := <-c
    fmt.Println("Sum:", result)
}

func sum(s []int, c chan int) {
    total := 0
    for _, num := range s {
        total += num
    }
    c <- total
}

如果处理多个goroutine,可以使用等待组和多个通道:

func main() {
    slices := [][]int{
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9},
    }
    
    results := make(chan int, len(slices))
    var wg sync.WaitGroup
    
    for _, s := range slices {
        wg.Add(1)
        go func(nums []int) {
            defer wg.Done()
            total := 0
            for _, num := range nums {
                total += num
            }
            results <- total
        }(s)
    }
    
    go func() {
        wg.Wait()
        close(results)
    }()
    
    for result := range results {
        fmt.Println("Partial sum:", result)
    }
}
回到顶部