为什么该go程序在完成打印后仍会打印?

I implemented the producer-consumer pattern yet I see a strange behavior.
It doesn't occur regularly just once in multiple runs.

package main

import (
    "fmt"
    "sync"
)

func main() {
    works := make(chan string)
    var wg sync.WaitGroup
    wg.Add(2)
    go func() {
        defer wg.Done()
        generators(2, works)
    }()
    go func() {
        defer wg.Done()
        readers(3, works)
    }()
    wg.Wait()
    fmt.Println("Done!")
}

func generators(numberOfProducers int, works chan string) {
    var wg sync.WaitGroup
    for i := 0; i < numberOfProducers; i++ {
        name := fmt.Sprintf("gen#%d", i)
        wg.Add(1)
        go func() {
            defer wg.Done()
            for i := 0; i < 5; i++ {
                works <- fmt.Sprintf("%s-%d", name, i)
            }
        }()
    }
    wg.Wait()
    close(works)
}

func readers(numberOfConsumers int, works chan string) {
    for i := 0; i < numberOfConsumers; i++ {
        name := fmt.Sprintf("reader #%d", i)
        go func() {
            for task := range works {
                fmt.Println(name, " got ", task)
            }
        }()
    }
}

I expect that "Done!" is the last thing printed on screen, something like this:

reader #2  got  gen#0-3
reader #0  got  gen#1-3
<removed repetitive output>
reader #1  got  gen#0-2
Done!

But sometimes after multiple runs I get this:

reader #2  got  gen#0-3
reader #0  got  gen#1-3
<removed repetitive output>
reader #1  got  gen#0-2
Done!
reader #2  got  gen#0-4

Why is there something printed after "Done!" ? As you can see, I am waiting for both readers and generators to finish before moving to printing "Done!".