package main import( "net/http" "log" ) func main(){//註冊某個函數專門響應某個路由"/",函數簽名符合 http.HandleFunc("/",func(w http.ResponseWriter,r *http.Request){ w.Write([]byte("Hello,this is version 1!")) }) http.HandleFunc("/bye",sayBye) log.Println("Starting server ... v1") log.Fatal(http.ListenAndServe(":4000",nil)) } func sayBye( w http.ResponseWriter,r *http.Request){ w.Write([]byte("Bye bye,this is version 1!")) } go run test.go 2018/07/09 14:32:08 Starting server ... v1
瀏覽器打開訪問:http://localhost:4000/
瀏覽器打開訪問:http://localhost:4000/bye
編程
如何使用mux自定義ServeHTTP,實現http server呢?瀏覽器
package main import( "net/http" "log" ) func main(){ mux := http.NewServeMux() mux.Handle("/",&myHandler{}) mux.HandleFunc("bye",sayBye) log.Println("Starting server ... v2") log.Fatal(http.ListenAndServe(":4000",mux)) } type myHandler struct {} func (*myHandler) ServeHTTP(w http.ResponseWriter,r *http.Request){ w.Write([]byte("Hello,this is version 2!")) } func sayBye(w http.ResponseWriter,r *http.Request){ w.Write([]byte("Bye bye,this is version 2!")) } go run test.go 2018/07/09 15:37:35 Starting server ... v2
瀏覽器打開訪問:http://localhost:4000/
瀏覽器打開訪問:http://localhost:4000/bye服務器
瀏覽器打開訪問:http://localhost:4000/abcdef 默認也匹配到這裏
ide
全部未匹配到的路由都會匹配到跟 "/" 路由函數
package main import( "net/http" "log" ) func main(){ mux := http.NewServeMux() mux.Handle("/",&myHandler{}) //全部未匹配到的路由都會匹配到跟路由 mux.HandleFunc("bye",sayBye) log.Println("Starting server ... v2") log.Fatal(http.ListenAndServe(":4000",mux)) } type myHandler struct {} func (*myHandler) ServeHTTP(w http.ResponseWriter,r *http.Request){ w.Write([]byte("Hello v2,the request url is:"+ r.URL.String())) } func sayBye(w http.ResponseWriter,r *http.Request){ w.Write([]byte("Bye bye,this is version 2!")) } go run test.go 2018/07/09 15:50:23 Starting server ... v2
瀏覽器打開訪問:http://localhost:4000/nihao 默認也匹配到/這裏
ui
如何自定義server信息呢?this
import( "net/http" "log" "time" ) func main(){ server :=&http.Server{ Addr: ":4000", WriteTimeout:2 * time.Second, } mux := http.NewServeMux() mux.Handle("/",&myHandler{}) //全部未匹配到的路由都會匹配到跟路由 mux.HandleFunc("bye",sayBye) server.Handler=mux log.Println("Starting server ... v2") log.Fatal(server.ListenAndServe) } type myHandler struct {} func (*myHandler) ServeHTTP(w http.ResponseWriter,r *http.Request){ w.Write([]byte("Hello v2,the request url is:"+ r.URL.String())) } func sayBye(w http.ResponseWriter,r *http.Request){ w.Write([]byte("Bye bye,this is version 2!")) } go run test.go 2018/07/09 15:57:46 Starting server ... v2 2018/07/09 15:57:46 0x120ef70 瀏覽器打開訪問:http://localhost:4000 訪問正常
客戶端能夠主動斷開url
package main import( "net/http" "log" "time" "os" "os/signal" ) func main(){ server :=&http.Server{ Addr: ":4000", WriteTimeout:4 * time.Second, } quit := make(chan os.Signal) signal.Notify(quit,os.Interrupt) mux := http.NewServeMux() mux.Handle("/",&myHandler{}) //全部未匹配到的路由都會匹配到跟路由 mux.HandleFunc("bye",sayBye) server.Handler=mux go func(){ <-quit if err:=server.Close(); err != nil { log.Fatal("Close server:",err) } }() log.Println("Starting server ... v3") err := server.ListenAndServe() if err !=nil{ if err == http.ErrServerClosed{ log.Print("Server closed under request") }else{ log.Fatal("Server closed unexpected") } } log.Println("Server exit") } type myHandler struct {} func (*myHandler) ServeHTTP(w http.ResponseWriter,r *http.Request){ w.Write([]byte("Hello v2,the request url is:"+ r.URL.String())) } func sayBye(w http.ResponseWriter,r *http.Request){ time.Sleep(3*time.Second) w.Write([]byte("Bye bye,this is version 2!")) } 2018/07/09 20:53:41 Starting server ... v3 此時暫停程序,ctrl+c 2018/07/09 20:54:01 Server closed under request 2018/07/09 20:54:01 Server exit
如何實現不一樣的路由轉發呢?code
package main import ( "log" "net/http" "time" ) //建立一個map,進行路由的轉發 var mux map[string]func(http.ResponseWriter, *http.Request) func main() { server := http.Server{ Addr: ":8090", Handler: &myHandler{}, ReadTimeout: 5 * time.Second, } //經過路由註冊,/hello 和 /bye 是不一樣的錄用,調用不一樣的func mux = make(map[string]func(http.ResponseWriter, *http.Request)) //分配點內存空間 mux["/hello"] = sayHello mux["/bye"] = sayBye err := server.ListenAndServe() if err != nil { log.Fatal(err) } } type myHandler struct{} func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if h, ok := mux[r.URL.String()]; ok { //map的妙用,判斷有沒有註冊路由,若是有,找到,ok=true h(w, r) return } } func sayHello(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello,this is version 3!")) } func sayBye(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Bye,this is version 4!")) }
go run test.go
瀏覽器訪問:http://localhost:8090/hello
返回:Hello,this is version 3!
瀏覽器訪問:http://localhost:8090/bye
返回:Bye,this is version 4!server