为什么会出现内存泄漏?

I have the following: http://play.golang.org/p/1aaive8KQx

When I print the runtime.NumGoroutine() I get 3. Shouldn't I be getting just 1? Why?

package main

import (
    "log"
    "runtime"
    "time"
)

func main() {
    for i := 1; i <= 10; i++ {
        ch := make(chan int, 10)
        timeout := time.Tick(1 * time.Second)
        for i := 1; i <= 10; i++ {
            go func(i int) {
                time.Sleep(2 * time.Second)
                ch <- i
            }(i)
        }

        for i := 1; i <= 10; i++ {
            select {
            case j := <-ch:
                log.Println(j)
            case <-timeout:
                log.Println("timeout")

            }

        }

        log.Println("Processes", runtime.NumGoroutine())
    }
}

There is a weird race condition. Basically what happens is when you call Println some goroutines are still running but will terminate shortly. Put a sleep before Println and you will get 1 Processes. If you read the log you will see 2 timeouts - it means you skipped 2 channel reads in the loop. Somehow it gives your main goroutine time to read 8 values from the channel and call Println before 2 goroutines are terminated. It's a race condition so it's hard to describe exactly what's going on. Apart from your code the scheduler and channels implementation also play major here.