共计 327 个字符,预计需要花费 1 分钟才能阅读完成。
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 应该会死锁,一直无法退出才是。
但是实际执行时错不报错,这是为什么?多谢
正文完