title: Deadlock error in golang
body: <p>I recently looked at go and got hooked, it looks so interesting! After completing the tutorial I wanted to build something by myself: I want to list all of my songs from my music library. I think I can profit from go's concurrency here. While on routine is walking down the directory tree it pushes music files (path to those files) into a channel which are then picked up by another routine that reads the ID3 tags, so I don't have to wait until every file has been found.</p>
  
  <p>This is my simple and naive approach:</p>
  
  <pre><code>package main
  
  import (
      "fmt"
      "os"
      "path/filepath"
      "strings"
      "sync"
  )
  
  const searchPath = "/Users/luma/Music/test" // 5GB of music.
  
  func main() {
      files := make(chan string)
  
      var wg sync.WaitGroup
      wg.Add(2)
  
      go printHashes(files, &amp;wg)
      go searchFiles(searchPath, files, &amp;wg)
  
      wg.Wait()
  }
  
  func searchFiles(searchPath string, files chan&lt;- string, wg *sync.WaitGroup) {
      visit := func(path string, f os.FileInfo, err error) error {
          if !f.IsDir() &amp;&amp; strings.Contains(".mp4.mp3.flac", filepath.Ext(f.Name())) {
              files &lt;- path
          }
          return err
      }
  
      if err := filepath.Walk(searchPath, visit); err != nil {
          fmt.Println(err)
      }
  
      wg.Done()
  }
  
  func printHashes(files &lt;-chan string, wg *sync.WaitGroup) {
      for range files {
          fmt.Println(&lt;-files)
      }
  
      wg.Done()
  }
  </code></pre>
  
  <p>This program doesn't read the tags, yet. Instead it just prints the file path. This works, it lists all music files extremely fast! But I see this error after the program finishes:</p>
  
  <pre><code>fatal error: all goroutines are asleep - deadlock!
  
  goroutine 1 [semacquire]:
  sync.runtime_Semacquire(0xc42007205c)
      /usr/local/Cellar/go/1.7.4_2/libexec/src/runtime/sema.go:47 +0x30
  sync.(*WaitGroup).Wait(0xc420072050)
      /usr/local/Cellar/go/1.7.4_2/libexec/src/sync/waitgroup.go:131 +0x97
  main.main()
      /Users/luma/Code/Go/src/github.com/LuMa/test/main.go:22 +0xfa
  
  goroutine 17 [chan receive]:
  main.printHashes(0xc42008e000, 0xc420072050)
      /Users/luma/Code/Go/src/github.com/LuMa/test/main.go:42 +0xb4
  created by main.main
      /Users/luma/Code/Go/src/github.com/LuMa/test/main.go:19 +0xab
  exit status 2
  </code></pre>
  
  <p>What is causing the deadlock?</p>