请求 HelloServer, 响应 "hello , world", 为什么主函数结束了,
里面协调会一直运行下去?
go func() {
for {
fmt.Println("go go go")
time.Sleep(2 * time.Second)
}
}()
完整代码:
package main
import (
"fmt"
"io"
"net/http"
"time"
)
func main() {
http.HandleFunc("/", HelloServer)
http.ListenAndServe("localhost:8082", nil)
}
func HelloServer(w http.ResponseWriter, r *http.Request) {
// 为什么会一直运行?
go func() {
for {
fmt.Println("go go go")
time.Sleep(2 * time.Second)
}
}()
io.WriteString(w, "hello , world")
}
###你从 http.ListenAndServe
一直追溯源码的话,你会看到 func (srv *Server) Serve(l net.Listener) error 这个方法是有一个循环在一直开启新的协程处理请求,只有在 异常情况/主动关闭服务 才会退出。
简单总结下:如上的代码中,主协程走到srv.Serve方法就会一直循环处理,一旦有请求来到就会新开一个goroutine(1)来处理HelloServer
这个handler,而这个handler又会新开一个goroutine(2)来处理handler中的循环。1 运行结束后直接退出,2 则因为是死循环会跟主协程的生命周期保持一致。
你的协程没有退出点也,肯定会一直执行,for
语句本身就是无限循环了。