title: How to decompress tar.gz file in go?
body: <p>I have a file called <code>file.tar.gz</code> and it has a <code>folder</code> inside. Using go I want to decompress it and save the folder in the current directory.</p>
  
  <p>I've found these code on a forum but it doesn't work in my case.</p>
  
  <pre><code>package main
  
  import (
      "archive/tar"
      "compress/gzip"
      "io"
      "log"
      "os"
  )
  
  func ExtractTarGz(gzipStream io.Reader) {
      uncompressedStream, err := gzip.NewReader(gzipStream)
      if err != nil {
          log.Fatal("ExtractTarGz: NewReader failed")
      }
  
      tarReader := tar.NewReader(uncompressedStream)
  
      for true {
          header, err := tarReader.Next()
  
          if err == io.EOF {
              break
          }
  
          if err != nil {
              log.Fatalf("ExtractTarGz: Next() failed: %s", err.Error())
          }
  
          switch header.Typeflag {
          case tar.TypeDir:
              if err := os.Mkdir(header.Name, 0755); err != nil {
                  log.Fatalf("ExtractTarGz: Mkdir() failed: %s", err.Error())
              }
          case tar.TypeReg:
              outFile, err := os.Create(header.Name)
              if err != nil {
                  log.Fatalf("ExtractTarGz: Create() failed: %s", err.Error())
              }
              defer outFile.Close()
              if _, err := io.Copy(outFile, tarReader); err != nil {
                  log.Fatalf("ExtractTarGz: Copy() failed: %s", err.Error())
              }
          default:
              log.Fatalf(
                  "ExtractTarGz: uknown type: %s in %s",
                  header.Typeflag,
                  header.Name)
          }
      }
  }
  func main() {
      r, err := os.Open("./file.tar.gz")
      if err != nil {
          log.Fatalf(err.Error())
      }
      ExtractTarGz(r)
  }
  
  </code></pre>
  
  <p>It gives me the error:</p>
  
  <pre><code>ExtractTarGz: Create() failed: open go/pkg/linux_amd64_race/unicod/utf16.a: too many open files exit status 1 
  </code></pre>