package main
import (
"log"
"net/http"
)
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("Start version v1")
log.Fatal(http.ListenAndServe(":4000", nil))
}
func SayBye(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Bye bye, this is version v1"))
//進行一個流式傳遞,將字符串轉換為byte類型
}
package main
import (
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
//自己創建servemux,然后使用自己的handle方法
mux.Handle("/", &myHandler{})
//默認的mux中根路由包含了所有的未匹配的路由
mux.HandleFunc("/bye", SayBye)
log.Println("Start version v1")
log.Fatal(http.ListenAndServe(":4000", mux))
}
type myHandler struct{} //自己定義handler結構
//實現myHandler的ServeHTPP方法
func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello this is version 2!,the requeset URL is:" + r.URL.String()))
//這里可以打印出完整的URL,響應的都是根路由
//大部分web結構的路由都是在ServerHTTP的方法中實現的
}
func SayBye(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Bye bye, this is version v2"))
//進行一個流式傳遞,將字符串轉換為byte類型
}
源碼解析
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}
//這里可以看出我們可以自定義server對象,然后進行監聽
//完整源碼
package main
import (
"log"
"net/http"
"time"
)
func main() {
server := &http.Server{
Addr: ":4000",
WriteTimeout: 4 * time.Second,
}
mux := http.NewServeMux()
//自己創建servemux,然后使用自己的handle方法,mux就是實現了handler接口的一個變量
mux.Handle("/", &myHandler{})
//默認的mux中根路由包含了所有的未匹配的路由
mux.HandleFunc("/bye", SayBye)
//將mux集成到server當中,server.Handle也是handle類型的接口,所以可以直接賦值
server.Handler = mux
log.Println("Start version v3")
log.Fatal(server.ListenAndServe())
}
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類型
}
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類型
}