下面是一个使用Go语言并发计算文件MD5的示例代码,其中利用了Goroutine和channel实现了并发计算和结果收集:

package main

import (
    "crypto/md5"
    "fmt"
    "io"
    "os"
    "path/filepath"
)

type FileData struct {
    Path string
    MD5  string
    Err  error
}

func main() {
    files := []string{"file1.txt", "file2.txt", "file3.txt"} // 要计算MD5的文件列表
    fileDataChan := make(chan FileData)

    // 开启Goroutine计算每个文件的MD5并将结果发送到channel
    for _, file := range files {
        go func(file string) {
            fileData := FileData{Path: file}
            f, err := os.Open(file)
            if err != nil {
                fileData.Err = err
                fileDataChan <- fileData
                return
            }
            defer f.Close()

            h := md5.New()
            if _, err := io.Copy(h, f); err != nil {
                fileData.Err = err
                fileDataChan <- fileData
                return
            }

            fileData.MD5 = fmt.Sprintf("%x", h.Sum(nil))
            fileDataChan <- fileData
        }(file)
    }

    // 收集所有文件的MD5结果
    fileDataList := make([]FileData, len(files))
    for i := 0; i < len(files); i++ {
        fileDataList[i] = <-fileDataChan
    }

    // 打印结果
    for _, fileData := range fileDataList {
        if fileData.Err != nil {
            fmt.Printf("Failed to calculate MD5 of file %s: %s\n", fileData.Path, fileData.Err)
        } else {
            fmt.Printf("MD5 of file %s is %s\n", fileData.Path, fileData.MD5)
        }
    }
}

在上面的代码中,我们首先定义了一个FileData结构体来存储每个文件的路径、MD5值和任何可能的错误。然后,我们定义了一个fileDataChan通道来在Goroutine之间传递文件MD5的结果。

接下来,我们使用一个循环来遍历文件列表,并为每个文件开启一个Goroutine。在Goroutine中,我们首先打开文件并检查是否有错误。如果没有错误,我们使用io.Copy()函数将文件内容拷贝到MD5哈希计算器中,并计算哈希值。最后,我们将结果发送到fileDataChan通道中。

在Goroutine结束后,我们使用另一个循环来收集所有文件的MD5值。我们使用一个fileDataList切片来存储所有文件的MD5结果,并在每个Goroutine的结束时将结果添加到该切片中。最后,我们遍历所有文件的MD5结果,打印出文件名和对应的MD5值或错误信息。

通过使用并发计算文件MD5,我们可以大大提高计算效率,并在处理大量文件时节省时间。

golang并发计算文件md5效率优化 提供代码

原文地址: http://www.cveoy.top/t/topic/4T4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录