還記得之前有個http.ListenAndServe嗎,現在來看看它的定義:
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}
可以看出,原來內部是實現了一個Server結構體,然後調用這個結構體對象的ListenAndServe函數。下面我們就自己來實現一個Server並用我們自定義的Server來實現一個HTTP服務,代碼如下:
package main
import (
"io"
"net/http"
)
func main () {
mux := http.NewServeMux()
mux.HandleFunc("/hi", sayHi)
myServer := &http.Server{
Addr: "127.0.0.1:8080",
Handler: &MyHandler{mux},
}
//myServer.
myServer.ListenAndServe()
}
type MyHandler struct {
Mux *http.ServeMux
}
func (mh *MyHandler)ServeHTTP(w http.ResponseWriter, r *http.Request) {
mh.Mux.ServeHTTP(w, r)
}
func sayHi(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "hi, this is cutom server")
}
到此,go web編程的第一階段探索就到此告一段落。總結一下:
(1)可以用net庫底層的默認ServeMux對象實現路由,我們只需要寫好url路徑的處理函數註冊進去就可以了;
(2)我們自定義ServerMux對象,並實現ServeHTTP接口,同時可以自定義url路徑處理函數。
(3)我們自定義Server對象,並調用該對象的ListenAndServe接口實現HTTP服務。
三種情景由淺入深自定義了HTTP服務的部分服務。
(全文完)