fmt.Fprintf(w, "Hello jingjing")

println("Welcome to Chris's homepage! ")

}

func main() {

http.HandleFunc("/", defaultGateWay)

http.ListenAndServe(":8080", nil)

}

//访问http://host:8080/ 即可看到Hello jingjin

复制代码

由上面这个例子可知,我们只执行了两步就完成了一个简易的web路由,分别执行了HandleFunc以及ListenAndServe两个函数。那这两个函数中又分别执行了什么操作呢

先看下面这段源码:

/调用默认ServerMux的HandleFunc方法

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {

DefaultServeMux.HandleFunc(pattern, handler)

}

//把方法handler转换成HandlerFunc类型,即实现了Handler接口;再执行Handle方法

func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {

mux.Handle(pattern, HandlerFunc(handler))

}

//路由器注册一个handler给指定的parttern

func (mux *ServeMux) Handle(pattern string, handler Handler) {

....

}

复制代码

不难看出,执行HandleFunc其实就是为某一规则的请求注册处理器。

下面我们看看ListenAndServe都干了什么,看下面一段源码:

func ListenAndServe(addr string, handler Handler) error {

//初始化一个Server Struct 赋值server的地址和Handler,不过Handler经常性为空,因为会使 //用DefaultServeMux

server := &Server{Addr: addr, Handler: handler}

return server.ListenAndServe()

}

//通过tcp网络监听addr地址

func (srv *Server) ListenAndServe() error {

addr := srv.Addr

if addr == "" {

addr = ":http"

}

ln, err := net.Listen("tcp", addr)

if err != nil {

return err

}

//for死循环一直接受http request, 每个请求开启一个新的goroutine处理

return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})

}

复制代码

由此,我们可以简单归纳出上文代码所做的操作:

  • 为不同的url规则注册路由handler

  • 创建server并监听端口

  • for循环一直接收request并并发处理

为不同的url规则注册路由handler

创建server并监听端口

for循环一直接收request并并发处理

PS: 这一期的还是比较简单,下一期争取实现一个真正能满足业务需求的http路由和web

[size=13.3333px]

本文来自:开源中国博客