code: func (z *ZipArchive) ExtractToFunc(destPath string, fn cae.HookFunc, entries ...string) (err error) {
  	destPath = strings.Replace(destPath, "\\", "/", -1)
  	isHasEntry := len(entries) > 0
  	if Verbose {
  		fmt.Println("Unzipping " + z.FileName + "...")
  	}
  	os.MkdirAll(destPath, os.ModePerm)
  	for _, f := range z.File {
  		f.Name = strings.Replace(f.Name, "\\", "/", -1)
  
  		// Directory.
  		if strings.HasSuffix(f.Name, "/") {
  			if isHasEntry {
  				if cae.IsEntry(f.Name, entries) {
  					if err = fn(f.Name, f.FileInfo()); err != nil {
  						continue
  					}
  					os.MkdirAll(path.Join(destPath, f.Name), os.ModePerm)
  				}
  				continue
  			}
  			if err = fn(f.Name, f.FileInfo()); err != nil {
  				continue
  			}
  			os.MkdirAll(path.Join(destPath, f.Name), os.ModePerm)
  			continue
  		}
  
  		// File.
  		if isHasEntry {
  			if cae.IsEntry(f.Name, entries) {
  				if err = fn(f.Name, f.FileInfo()); err != nil {
  					continue
  				}
  				err = extractFile(f, destPath)
  			}
  		} else {
  			if err = fn(f.Name, f.FileInfo()); err != nil {
  				continue
  			}
  			err = extractFile(f, destPath)
  		}
  		if err != nil {
  			return err
  		}
  	}
  	return nil
  }
docs: // ExtractToFunc extracts the whole archive or the given files to the
  // specified destination.
  // It accepts a function as a middleware for custom operations.