Server的结构如下:
type Server struct {
Addr string // 网络地址,默认使用80端口
Handler Handler // 处理器,若为空则默认使用http.DefaultServeMux这个实例
TLSConfig *tls.Config
ReadTimeout time.Duration
ReadHeaderTimeout time.Duration
WriteTimeout time.Duration
IdleTimeout time.Duration
MaxHeaderBytes int
TLSNextProto map[string]func(*Server, *tls.Conn, Handler)
ConnState func(net.Conn, ConnState)
ErrorLog *log.Logger
disableKeepAlives int32 // accessed atomically.
inShutdown int32 // accessed atomically (non-zero means we're in Shutdown)
nextProtoOnce sync.Once // guards setupHTTP2_* init
nextProtoErr error // result of http2.ConfigureServer if used
mu sync.Mutex
listeners map[net.Listener]struct{}
activeConn map[*conn]struct{}
doneChan chan struct{}
onShutdown []func()
}
构建一个简单的web服务器:
package main
import (
"fmt"
"net/http"
)
//定义一个处理器
type MyHandler struct{}
func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello world!!!")
}
func main() {
handler := MyHandler{}
server := http.Server{
Addr: "0.0.0.0:8080",
Handler: &handler, //处理器没有路由功能,所有请求都是同样的回应
}
server.ListenAndServe() //开启web服务
}
快速配置,根据网络地址和处理器开启web服务:
http.ListenAndServe(addr string, handler Handler)
函数内部:
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler} //生成server实例
return server.ListenAndServe() //调用server.ListenAndServe()方法
}
http包有一个默认的多路复用器实例DefaultServeMux,当server成员Handler值为nil时,则默认使用DefaultServeMux。