package main
import (
"log"
"net/http"
)
func useless_func(address string) []byte {
http.Get("https://www.google.com")
return nil
}
func test_a(test_channel chan int) {
test_channel <- 1
return
}
func test() {
test_channel := make(chan int)
for i := 0; i < 10; i++ {
go test_a(test_channel)
}
for {
log.Println(<-test_channel)
}
}
func main() {
test()
}
this code would not break because of deadlock, I try this code under Linux 4.1.6-1 and 3.16.0-4 with go 1.5.1 amd64 and got same result. but if i delete useless_func or use go 1.4.3 or run this under windows,it would perform well. this is really weird, if anyone could explain this?
Dominik Honnef provides the answer in response to issue ##12734 for Go 1.5.1:
dominikh: The issue really lies with using cgo (which net uses, ignoring the details). When using cgo, the Go deadlock detection cannot function properly, because C world might call Go functions at any time, so in theory no deadlock exists; we might just be waiting for an external function call indefinitely.