Работа с файлами / Работа с архивами

import (
    "fmt"
    "archive/zip"
    "io"
    "os"
    "path/filepath"
    "strings"
)

var zipFile = "data.zip"
var err = unzip(zipFile, "tmp/")
if err != nil {
    fmt.Println(err)
}

func unzip(src, dest string) error {
    zipFile, err := zip.OpenReader(src)
    if err != nil {
        return err
    }
    defer zipFile.Close()

    for _, f := range zipFile.File {
        fileFrom, err := f.Open()
        if err != nil {
            return err
        }
        defer fileFrom.Close()

        fpath := filepath.Join(dest, f.Name)
        if f.FileInfo().IsDir() {
            os.MkdirAll(fpath, f.Mode())
        } else {
            var fdir string
            if lastIndex := strings.LastIndex(fpath, 
                string(os.PathSeparator)); lastIndex > -1 {
                fdir = fpath[:lastIndex]
            }

            err = os.MkdirAll(fdir, f.Mode())
            if err != nil {
                return err
            }
            fileTo, err := os.OpenFile(fpath, 
                os.O_WRONLY|os.O_CREATE|os.O_TRUNC
                f.Mode())
            if err != nil {
                return err
            }
            defer fileTo.Close()

            _, err = io.Copy(fileTo, fileFrom)
            if err != nil {
                return err
            }
        }
    }
    return nil
}