Golang 使用并发编程计算整数切片的总和
在这篇Go语言文章中,我们将编写程序,使用并发来接收一个整数切片并计算它们的总和。并发可以让多个任务或操作同时执行,它能够有效地利用系统资源。这是通过使用轻量级线程Go routines和通道channels来实现的,这些通道可以帮助go routines之间进行通信。
语法
func make ([] type, size, capacity)
在Go语言中,make函数用于创建数组/映射,它接受要创建的变量类型、大小和容量作为参数。
func range(variable)
range函数用于迭代任何数据类型。要使用它,我们首先必须写上range关键字,然后紧接着要迭代的数据类型,作为结果,循环将迭代到变量的最后一个元素。
func len(v Type) int
len()函数用于获取任何参数的长度。它接受一个参数作为数据类型变量,我们希望找到其长度,并返回整数值,该值是变量的长度。
步骤
- 该程序导入所需的 fmt、main 和 sync 等包,其中 fmt 在输入/输出操作中有所帮助,main 用于生成可执行代码,sync 用于实现并发任务。
-
创建一个名为 sum 的函数,它接受一个整数切片,其求和将被计算。
-
创建一个 total 变量,并将其初始化为 0。
-
然后,使用 range 函数迭代整数切片,并在每次迭代中将输入元素添加到 total 变量中。
-
在迭代所有元素之后,将 total 作为计算得到的总和返回。
-
在这一步中,创建一个并发的 Sum 函数,用于接受一个整数切片,并使用并发计算它们的和。
-
然后,根据切片的长度确定将输入切片分成多少个块,并将其存储在 num-chunks 变量中。
-
然后,使用 make 函数创建一个 slicesums,用于存储每个 goroutine 计算的部分和。
-
在这一步中,初始化一个 sync.Wait Group,并使用 Add 方法将计数设置为块的数量。
-
在这里,计算块大小以均匀分割输入切片。
-
然后,使用 for 循环为每个块启动一个 go routine。
-
在每个 go routine 中,使用 sum 函数计算其对应块的和,并将结果存储在 sums 切片中。
-
在这一步中,使用 wg.Wait() 函数等待所有 go routines 完成。
-
最后,将计算得到的总和作为结果返回给该函数。
-
创建一个 main 函数。
-
在 main 函数中,创建一个名为 slice 的整数切片。
-
然后,调用 concurrent_sum 函数来使用并发计算切片的和。
-
然后,使用 fmt 包的 Println 函数将计算得到的总和打印到控制台,其中 ln 表示换行。
示例
在本示例中,我们将编写一个 Go 语言程序,使用 go routines 和 channels 来并发地执行程序,计算切片中整数的总和。
package main
import (
"fmt"
"sync"
)
func sum(nums []int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
func concurrent_sum(nums []int) int {
num_chunks := len(nums)
sums := make([]int, num_chunks)
var wg sync.WaitGroup
wg.Add(num_chunks)
chunkSize := (len(nums) + num_chunks - 1) / num_chunks
for i := 0; i < num_chunks; i++ {
go func(i int) {
defer wg.Done()
start := i * chunkSize
end := (i + 1) * chunkSize
if end > len(nums) {
end = len(nums)
}
sums[i] = sum(nums[start:end])
}(i)
}
wg.Wait()
return sum(sums)
}
func main() {
slice := []int{10, 20, 30, 40, 50, 60, 70, 80, 90, 100}
fmt.Println("Numbers:", slice)
total := concurrent_sum(slice)
fmt.Println("The Sum of the elements of slice is:", total)
}
输出
Numbers: [10 20 30 40 50 60 70 80 90 100]
The Sum of the elements of slice is: 550
结论
我们使用一个使用Go例程和通道来执行并发过程的示例,编译并执行了计算整数片段总和的程序。因此,实现了并发。