一次由于Channel buffer size导致Go内存泄漏的分析

我代码里面有这么一段逻辑

func foo() int {
ch := make(chan int)
go func() {
ch <- 1
}()
go func() {
ch <- 2
}()
ret := <- ch
return ret
}

这里问题出在make(chan int)时,默认buffer size是0,这样两个go协程在试图往ch里加东西时,如果没有消费者,其实会一直卡死等待。但是我只消费一个,所以会导致一定有一个协程没有退出,导致内存泄漏。

我是通过go tool pprof 把goroutine的占用情况找出来发现这个问题的: