go web開發初探 《Go web程式設計》學習
本人之前一直學習java、java web,最近開始學習Go語言,所以也想了解一下Go語言中web的開發方式以及執行機制。
在《Go web程式設計》一書第三節中簡要的提到了Go語言中http的執行方式,我這裡是在這個的基礎上更加詳細的梳理一下。
這裡先提一句,本文中展示的原始碼都是在Go安裝目錄下src/net/http/server.go檔案中(除了自己寫的例項程式),如果各位還想理解的更詳細,可以自己再去研究一下原始碼。
《Go web程式設計》3.4節中提到http有兩個核心功能:Conn, ServeMux , 但是我覺得還有一個Handler介面也挺重要的,後邊咱們提到了再說。
先從一個簡單的例項來看一下Go web開發的簡單流程:
12345678910111213141516171819 | package main import ( "fmt" "log" "net/http" ) func sayHello(w http.ResponseWriter, r *http.Request) { fmt.Println( "Hello World!" ) } func main() { http.HandleFunc( "/hello" , sayHello) //註冊URI路徑與相應的處理函式 er := http.ListenAndServe( ":9090" , nil) // 監聽9090埠,就跟javaweb中tomcat用的8080差不多一個意思吧 if er != nil { log.Fatal( "ListenAndServe: " , er) } } |
在瀏覽器執行localhost:9090/hello 就會在命令列或者所用編輯器的輸出視窗 “Hello World!” (這裡為了簡便,就沒往網頁裡寫入資訊)
根據這個簡單的例子,一步一步的分析它是如何執行。
首先是註冊URI與相應的處理函式,這個就跟SpringMVC中的Controller差不多。
1 | http.HandleFunc( "/hello" , sayHello) |
來看一下他的原始碼:
123 | func HandleFunc(pattern string, handler func (ResponseWriter, *Request)) { DefaultServeMux.HandleFunc(pattern, handler) } |
裡邊實際是呼叫了DefaultServeMux的HandlerFunc方法,那麼這個DefaultServeMux是啥,HandleFunc又幹了啥呢?
1234567891011121314151617 | type ServeMux struct { mu sync.RWMutex m map [string]muxEntry hosts bool // whether any patterns contain hostnames } type muxEntry struct { explicit bool h Handler pattern string } func NewServeMux() *ServeMux { return &ServeMux{m: make( map [string]muxEntry)} } var DefaultServeMux = NewServeMux() |
事實上這個DefaultServeMux就是ServeMux結構的一個例項(好吧,看名字也看的出來),ServeMux是Go中預設的路由表,裡邊有個一map型別用於儲存URI與處理方法的對應的鍵值對(String,muxEntry),muxEntry中的Handler型別就是對應的方法。
再來看HandleFunc方法:
12345678910111213141516171819202122232425262728293031323334353637383940 | func
|