小天管理 发表于 2024年6月30日 发表于 2024年6月30日 package main import ( "fmt" "io" "net/http" ) func fetch(url string) string { resp, err := http.Get(url) if err != nil { return err.Error() } defer resp.Body.Close() written, err := io.Copy(io.Discard, resp.Body) if err != nil { return err.Error() } result := fmt.Sprintf("%s %s %d", url, resp.Status, written) return result } func request() string { ch := make(chan string) go func() { ch <- fetch("http://www.163.com") }() go func() { ch <- fetch("http://www.sohu.com") }() go func() { ch <- fetch("http://www.sina.com") }() result := <-ch return result } func main() { fmt.Println(request()) fmt.Scanln() } 这里假设 163.com goroutine 总是第一个执行完,此后 request 函数执行返回。 此时,进程未退出,另外两个 goroutine 仍将把 fetch 的结果发送到 ch ,但是由于 ch 是无缓存的,同时又因为 request 已经返回, 无人从 ch 中接收数据,所以另两个 goroutine 应该会死锁,一直无法退出才是。 但是实际执行时错不报错,这是为什么?多谢
已推荐帖子