Rumah >pembangunan bahagian belakang >Golang >Menggunakan goroutine untuk membina Zip, slice berada di luar julat, kapasiti ialah 4096
editor php Xiaoxin telah membawakan artikel tentang menggunakan goroutine untuk membina Zip. Dalam artikel ini, kita akan belajar cara menggunakan goroutine untuk melaksanakan operasi Zip serentak untuk meningkatkan kecekapan program. Di samping itu, kami akan membincangkan isu kepingan di luar julat dan menunjukkan cara menggunakan kepingan dengan kapasiti 4096 untuk menyelesaikan masalah ini. Sama ada anda seorang pemula atau pembangun yang berpengalaman, artikel ini akan membantu anda lebih memahami dan menggunakan pengetahuan yang berkaitan dengan goroutine dan penghirisan. Mari kita meneroka bersama-sama!
Saya cuba memperbaiki fungsi yang membina zip dengan menambahkan goroutine untuk mengendalikan setiap fail yang mesti diarkibkan.
Tetapi ia berakhir dengan panik
panic:运行时错误:切片超出范围[4126:4096
]
Direktori sasaran mengandungi 190 fail (500 bln). Saya benar-benar tidak faham apa yang salah Terima kasih terlebih dahulu atas bantuan anda
Ciri-ciri:
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 } bundle, err := os.create("/tmp/archive.zip") if err != nil { return err } bundlewriter := zip.newwriter(bundle) var wg sync.waitgroup wg.add(len(files)) for _, filepath := range files { go func(filepath string) { defer wg.done() relpath := strings.trimprefix(filepath, fmt.sprintf("%v/", filepath.dir("/tmp/dir-to-zip"))) bundlefile, err := bundlewriter.create(relpath) if err != nil { fmt.println(err) } fsfile, err := os.open(filepath) if err != nil { fmt.println(err) } _, err = io.copy(bundlefile, fsfile) if err != nil { fmt.println(err) } }(filepath) } wg.wait() err = bundlewriter.close() if err != nil { return err } return nil }
Ralat berlaku di sini:
_, err = io.copy(bundlefile, fsfile) if err != nil { fmt.println(err) }
Jejak tindanan:
goroutine 48 [running]: bufio.(*Writer).Write(0xc00002a100, {0xc00041a400?, 0x3d?, 0xc00041a400?}) /usr/local/go/src/bufio/bufio.go:670 +0x1c8 archive/zip.(*countWriter).Write(0xc00000c138, {0xc00041a400?, 0x3d?, 0x4afa20?}) /usr/local/go/src/archive/zip/writer.go:601 +0x2e io.WriteString({0x4e7538, 0xc00000c138}, {0xc0000212c9, 0x3d}) /usr/local/go/src/io/io.go:314 +0x91 archive/zip.writeHeader({0x4e7538, 0xc00000c138}, 0xc000220090) /usr/local/go/src/archive/zip/writer.go:422 +0x5ec archive/zip.(*Writer).CreateHeader(0xc0000760a0, 0xc00021e1b0) /usr/local/go/src/archive/zip/writer.go:378 +0x797 archive/zip.(*Writer).Create(0x4e7698?, {0xc0000212c9, 0x3d}) /usr/local/go/src/archive/zip/writer.go:223 +0x6c main.BuildArchive.func2({0xc0000212c0, 0x46}) /home/simba/go/src/foobar/main.go:79 +0x1c5 created by main.BuildArchive /home/simba/go/src/foobar/main.go:73 +0x5aa panic: runtime error: slice bounds out of range [:4126] with capacity 4096 goroutine 6 [running]: bufio.(*Writer).Flush(0xc00002a100) /usr/local/go/src/bufio/bufio.go:634 +0x171 bufio.(*Writer).Write(0xc00002a100, {0xc0001b4200?, 0xc000199b20?, 0xc000199b20?}) /usr/local/go/src/bufio/bufio.go:672 +0xd8 archive/zip.(*countWriter).Write(0xc00000c138, {0xc0001b4200?, 0x0?, 0xc000199b40?}) /usr/local/go/src/archive/zip/writer.go:601 +0x2e archive/zip.(*countWriter).Write(0xc000220018, {0xc0001b4200?, 0xc0001b02c0?, 0xc0001b02f0?}) /usr/local/go/src/archive/zip/writer.go:601 +0x2e compress/flate.(*huffmanBitWriter).write(...) /usr/local/go/src/compress/flate/huffman_bit_writer.go:136 compress/flate.(*huffmanBitWriter).writeCode(0xc0001b41e0?, {0x6000?, 0x22?}) /usr/local/go/src/compress/flate/huffman_bit_writer.go:347 +0xe5 compress/flate.(*huffmanBitWriter).writeTokens(0xc0001b41e0, {0xc002558000, 0x4001, 0x403f800000403f?}, {0xc0001aa900, 0x11e, 0x108129000000000f?}, {0xc0001ac100, 0x1e, 0x1e}) /usr/local/go/src/compress/flate/huffman_bit_writer.go:583 +0xb9 compress/flate.(*huffmanBitWriter).writeBlock(0xc0001b41e0, {0xc002558000?, 0x20?, 0xd79?}, 0x0, {0x0, 0x0, 0x0}) /usr/local/go/src/compress/flate/huffman_bit_writer.go:495 +0x490 compress/flate.(*compressor).writeBlock(0xc0005a2000, {0xc002558000?, 0xc000032f00?, 0xc000199d28?}, 0x47739b?) /usr/local/go/src/compress/flate/deflate.go:170 +0x9c compress/flate.(*compressor).deflate(0xc0005a2000) /usr/local/go/src/compress/flate/deflate.go:509 +0x59b compress/flate.(*compressor).write(0xc0005a2000, {0xc00256a000?, 0x8000, 0xf311b6fd?}) /usr/local/go/src/compress/flate/deflate.go:554 +0x82 compress/flate.(*Writer).Write(...) /usr/local/go/src/compress/flate/deflate.go:712 archive/zip.(*pooledFlateWriter).Write(0xc00020c040?, {0xc00256a000?, 0x8000?, 0x4af140?}) /usr/local/go/src/archive/zip/register.go:51 +0xc5 archive/zip.(*countWriter).Write(...) /usr/local/go/src/archive/zip/writer.go:601 archive/zip.(*fileWriter).Write(0xc000222000, {0xc00256a000, 0x8000, 0x8000}) /usr/local/go/src/archive/zip/writer.go:533 +0x97 io.copyBuffer({0x4e7558, 0xc000222000}, {0x4e7678, 0xc0001f8008}, {0x0, 0x0, 0x0}) /usr/local/go/src/io/io.go:428 +0x204 io.Copy(...) /usr/local/go/src/io/io.go:385 main.BuildArchive.func2({0xc00001c0c0, 0x35}) /home/simba/go/src/foobar/main.go:89 +0x385 created by main.BuildArchive /home/simba/go/src/foobar/main.go:73 +0x5aa exit status 2
zip.Writer
Tidak selamat untuk kegunaan serentak. Anda memulakan berbilang goroutine, setiap goroutine mencipta dan menulis entri zip (fail).
Writer.Create()
Rekod:
Buat menambah fail pada fail zip menggunakan nama yang disediakan. Ia mengembalikan Penulis ke mana kandungan fail harus ditulis.
[...] Kandungan fail mesti ditulis ke io.Writer sebelum panggilan seterusnya ke Create, CreateHeader atau Close.
Anda tidak boleh membuat zip pada masa yang sama. io.Writer
s 写入相同的底层文件(或一般情况下相同的 io.Writer
) untuk setiap entri zip, arkib zip yang terhasil mungkin tidak sah walaupun aplikasi anda tidak panik atau ranap.
Atas ialah kandungan terperinci Menggunakan goroutine untuk membina Zip, slice berada di luar julat, kapasiti ialah 4096. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!