package main
import (
"log"
"net/http"
"os"
"os/signal"
"time"
)
func main() {
server := &http.Server{
Addr: ":4000",
WriteTimeout: 4 * time.Second,
}
quit := make(chan os.Signal)
//創建chan,用來指示我要退出這個服務器了,麻煩幫忙關閉一下
signal.Notify(quit, os.Interrupt)
//註冊這個通知事件,一旦受到這個singal,發送一個對象到這個chan當中,當我接收到任意對象之後,我就知道服務器該退出了
mux := http.NewServeMux()
//自己創建servemux,然後使用自己的handle方法,mux就是實現了handler接口的一個變量
mux.Handle("/", &myHandler{})
//默認的mux中根路由包含了所有的未匹配的路由
mux.HandleFunc("/bye", SayBye)
//將mux集成到server當中,server.Handle也是handle類型的接口,所以可以直接賦值
server.Handler = mux
//創建一個gorouting 專門接收這個chan
go func() {
<-quit
if err := server.Close(); err != nil {
log.Fatal("Close server:", err)
}
}()
log.Println("Start version v3")
err := server.ListenAndServe()
if err != nil {
if err == http.ErrServerClosed {
log.Print("Server closed under requeset!!")
} else {
log.Fatal("Server closed unexpecteed!!")
}
}
log.Println("Server exit!!")
}
type myHandler struct{} //自己定義handler結構
//實現myHandler的ServeHTPP方法
func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello this is version 3!,the requeset URL is:" + r.URL.String()))
//這裏可以打印出完整的URL,響應的都是根路由
}
func SayBye(w http.ResponseWriter, r *http.Request) {
time.Sleep(3 * time.Second)
w.Write([]byte("Bye bye, this is version v3"))
//進行一個流式傳遞,將字符串轉換爲byte類型
}