I don't think you can combine zip headers.
, zip.Writer , goroutine, goroutine , goroutine, .
IO, , , , , .
. , , ,
defer LIFO, , .
package main
import (
"archive/zip"
"io"
"os"
"sync"
)
func ZipWriter(files chan *os.File) *sync.WaitGroup {
f, err := os.Create("out.zip")
if err != nil {
panic(err)
}
var wg sync.WaitGroup
wg.Add(1)
zw := zip.NewWriter(f)
go func() {
defer wg.Done()
defer f.Close()
var err error
var fw io.Writer
for f := range files {
if fw, err = zw.Create(f.Name()); err != nil {
panic(err)
}
io.Copy(fw, f)
if err = f.Close(); err != nil {
panic(err)
}
}
if err = zw.Close(); err != nil {
panic(err)
}
}()
return &wg
}
func main() {
files := make(chan *os.File)
wait := ZipWriter(files)
var wg sync.WaitGroup
wg.Add(len(os.Args)-1)
for i, name := range os.Args {
if i == 0 {
continue
}
go func(name string) {
defer wg.Done()
f, err := os.Open(name)
if err != nil {
panic(err)
}
files <- f
}(name)
}
wg.Wait()
close(files)
wait.Wait()
}
: go run example.go /path/to/*.log.
, :
- .
zip.Writer .- goroutine, .
- , .
- goroutine, 3.
- goroutine , .
- goroutine, .
- , zip ( ).
- , zip ( ), zip-writer .
- zip-, .
- , ,
sync.WaitGroup, , . ( , sync.WaitGroup .) - zip-, ,
main .
, zip- " " - . , . - .