使用并发计算整数切片之和的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 协程和通道来执行并发进程。因此,获得了并发性。

更新于:2023年8月4日

920 次查看

启动您的职业生涯

通过完成课程获得认证

开始学习
广告