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 回复
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
}
在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)
}
}


