Golang 使用并发编程计算整数切片的总和

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例程和通道来执行并发过程的示例,编译并执行了计算整数片段总和的程序。因此,实现了并发。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程