使用并发计算整数切片之和的Go语言程序
在这篇 Go 语言文章中,我们将编写程序来接收整数切片并使用并发计算它们的和。并发有助于同时执行多个任务或操作。它有助于有效利用系统资源。它是使用 Go 协程(轻量级线程)和通道(有助于 Go 协程之间通信)实现的。
语法
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 函数创建一个 sums 切片来存储每个 goroutine 计算的部分和。
在此步骤中,初始化一个 sync.WaitGroup 并使用 Add 方法向其中添加一个等于块数的计数。
在这里,计算块大小以均匀划分输入切片。
然后,使用 for 循环为每个块启动一个 go 协程。
在每个 go 协程中,使用 sum 函数计算其对应块的和,并将结果存储在 sums 切片中。
在此步骤中,使用 wg.Wait() 函数等待所有 go 协程完成。
最后,将计算出的和作为结果返回给函数。
创建一个 main 函数。
在 main 中,创建一个名为 slice 的整数切片。
然后,调用 slice 上的 concurrent_sum 函数以使用并发计算和。
然后,使用 fmt 包中的 Println 函数(ln 表示换行)将计算出的和打印到控制台。
示例
在此示例中,我们将编写一个 Go 语言程序,借助 go 协程和通道并发执行程序来计算切片中整数的和。
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 协程和通道来执行并发进程。因此,获得了并发性。