Go 语言 http 包简易入门
说到 go 语言 web 编程,必不可少的会使用到 net/http 包。go 语言将 web 开发需要使用到的很多内容都放在了标准库中 —— net/http。
一个简单的 web 程序
如何写一个简单的web程序很容易。如下:
package main
import (
"fmt"
"net/http"
)
func hello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello")
}
func main() {
server := &http.Server{
Addr: "0.0.0.0:8080",
}
http.HandleFunc("/hello", hello)
server.ListenAndServe()
}其中使用了http包。使用http.HandleFunc就是使用了一个处理器函数。
处理器函数是一个签名和ServeHTTP方法相同的函数,Go语言中,有一种HandlerFunc函数类型,可以加将这个函数转化为带有方法的处理器(Handler)?
使用 ServerMux 路由
ServerMux是一个路由管理器,也可以说是一个多路复用器,使用方式如下:
package main
import (
"fmt"
"net/http"
)
func main() {
servermux := http.NewServeMux()
servermux.HandleFunc("/hello", hello)
server := &http.Server{
Addr: ":8080",
Handler: servermux,
}
server.ListenAndServe()
}
func hello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "hello world")
}其实是在使用http.HandleFunc的时候,调用了
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
DefaultServeMux.HandleFunc(pattern, handler)
}这样的话,其实是使用了一个变量DefaultServeMux,再看看这个变量的内容:
var DefaultServeMux = &defaultServeMux
var defaultServeMux ServeMux这个变量其实就是ServeMux的实例。也就是ServeMux,所以在使用http的handerfunc的时候,是使用了这个多路复用器的。这个处理器也是默认的处理器。如果没有声明或者直接使用其他的处理器的时候,调用处理器函数和处理器都是使用了这个。
HandleFunc
接下来看HandleFunc这个函数,以上使用的http包的函数HandleFunc最终调用的是ServeMux的HandleFunc。所以在使用的时候Handle和HandleFunc完全一致。
type HandlerFunc func(ResponseWriter, *Request)HandleFunc最终会将函数转成HandleFunc,等同于Handler,Handler是一个接口,如下:
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}所以其实这两种类型是等价的。
