使用 goroutines panic 构建 Zip,切片边界超出容量 4096

我正在尝试通过添加 goroutines 来处理每个必须存档的文件来改进构建 Zip 的功能。但它以恐慌告终 panic: runtime error: slice bounds out of range [4126:4096]


目标目录包含 190 个文件(500 Mo)。我真的不明白出了什么问题,提前感谢您的帮助


功能 :


func BuildArchive() error {                                                        

                                                                                   

    var files []string                                                             

    err := filepath.Walk("/tmp/dir-to-zip", func(filePath string, info os.FileInfo, err error) error {

        if info.IsDir() {                                                          

            return nil                                                             

        }                                                                          

        if err != nil {                                                            

            fmt.Println(err)                                                       

            return err                                                             

        }                                                                          

        files = append(files, filePath)                                            

                                                                                   

        return nil                                                                 

    })                                                                             

    if err != nil {                                                                

        return err                                                                 

    }                                                                              

                                                                                   


catspeake
浏览 117回答 1
1回答

红糖糍粑

zip.Writer同时使用不安全。您启动多个 goroutines,每个 goroutines 创建和写入 zip 条目(文件)。Writer.Create()记录:创建使用提供的名称将文件添加到 zip 文件。它返回应写入文件内容的 Writer。[...]在下一次调用 Create、CreateHeader 或 Close 之前,必须将文件的内容写入 io.Writer。您不能同时创建一个 zip。io.Writer每个 zip 条目的 s 写入相同的底层文件(或通常相同的文件io.Writer),即使您的应用程序没有崩溃或崩溃,生成的 zip 存档也可能无效。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go