這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
What you are wasting today is tomorrow for those who died yesterday; what you hate now is the future you can not go back.
你所浪費的今天是昨天死去的人奢望的明天; 你所厭惡的現在是未來的你回不去的曾經。
最近公司有一個項目不算大,但是流量預計不小,分配到我這來了,要求快速上線,由於本人研究Golang兩個多月(本人愚鈍),加上對GOlang的癡迷,考慮偷偷的(其實是項目總監被我說服了)使用go來寫web服務。 看到這我只能說,瞎扯淡啥!!
上菜:
首先自訂路由的前提是路由對象實現ServeHTTP方法
自訂路由寫法一:
1. 路由結構體對象定義
type Router struct {Route map[string]map[string]http.HandlerFunc}
Route屬性的類型是map , 其中一維的鍵String表示請求method比如post, get 等。二維的鍵string表示
要匹配的URL地址, http.HandlerFunc當然就是處理URL請求的具體方法。
2. URL路由表初始化
// 路由表初始化func (r *Router) HandleFunc(method, path string, f http.HandlerFunc) {method = strings.ToUpper(method)if r.Route == nil {r.Route = make(map[string]map[string]http.HandlerFunc)}if r.Route[method] == nil {r.Route[method] = make(map[string]http.HandlerFunc)}r.Route[method][path] = f}
當然首先要初始化Map,有幾個就初始化幾個, 否則就會報錯哦。初始化後,調用方就可以使用
route.HandleFunc("GET", "/", HomeHandler)
此種方式初始化路由表了。
3. 實現路由核心處理ServeHTTP方法
func (r *Router) ServeHTTP(res http.ResponseWriter, req *http.Request) {// 此處我做個很多關於http請求header的限制,一級業務版本處理,就不公布出來了 // ....// 正常路由if f, ok := r.Route[req.Method][req.URL.Path]; ok {f(res, req)//靜態檔案路由} else if strings.HasPrefix(req.URL.String(), staticHttpPath){staticFile := http.StripPrefix(staticHttpPath, http.FileServer(http.Dir(staticDirPath)))staticFile.ServeHTTP(res, req)// 404友好處理}else {// 由於此項目目的是提供介面和WEB HTML服務,所以此處本人做了一系列的url處理}}
另外本人還根據業務做了一些關於web伺服器的友好調用處理,比如開啟關閉header檢測, 服務下線上線處理等等。如果各位親愛的【碼友】還有其他好的建議,請賜教.^_^
自訂路由寫法二:
此寫法類似與MVC
1. 定義控制器結構體對象
type UrlHandlerController struct {Function func(http.ResponseWriter, *http.Request)Method stringPattern string}
Pattern就是要匹配的URL地址。
2. 定義路由對象
var mux []UrlHandlerController
調用方在調用過程中就會是用 mux = append(mnx, UrlHandlerController{ XXXFUNC, "POST", "/index" }) 此種方式調用初始化路由表。
3. 定義路由對象
type httpHandler struct{}
4.實現路由核心邏輯
func (*httpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // 當然無法避免的Header頭處理檢測// t := time.Now() // 此處有一個不好的寫法就是 UrlHandlerController變數最好不要跟已存在的類型重名,否則........for _, UrlHandlerController := range mux {if m, _ := regexp.MatchString(UrlHandlerController.Pattern, r.URL.Path); m {if r.Method == UrlHandlerController.Method {UrlHandlerController.Function(w, r)// 做一些日誌等的處理return}}} // 此處做需要根據項目做一個具體的最佳化處理:個人建議io.WriteString(w, "")return}
其實核心的處理就是簡單的尋找路由地址, 找到了就請求改地址的處理方法。
如果碼友們有好的建議,請留下你的痕迹