近段時間從新對個人Web應用程序進行了一些思考,首先程序啓動的main.go文件中,暫時的路由添加沒有太大的問題,可是根據以往的項目開發經驗,若是這個系統對外分享的話,以後在作大項目的時候,會遇到添加不少路由的狀況,而後就會發現文件變的愈來愈大,關鍵是路由還放在了main.go文件中,這個實在是太麻煩了,因而今天作了下少量的改動。git
每次我都會將本身實踐的代碼放到github上而且都會打一個tag,方便後面用的同窗使用,這裏我如下面分支的代碼進行實踐分享github
https://github.com/durban89/typescript_demo.git tag: 1.0.12
一、改動main.go文件typescript
將原來的函數
http.HandleFunc("/view/", helpers.MakeHandler(controllers.ArticleView)) http.HandleFunc("/save/", helpers.MakeHandler(controllers.ArticleSave)) http.HandleFunc("/edit/", helpers.MakeHandler(controllers.ArticleEdit)) http.HandleFunc("/upload/", controllers.UploadHandler) http.HandleFunc("/postFile/", controllers.PostFileHandler)
用下面的代碼替換掉post
router.Routes()
這樣咱們將路由這一塊的邏輯分到一個負責路由的文件來作處理,這樣main.go文件就看起來很簡潔。測試
二、添加router.go優化
建立文件router/router.go,添加代碼以下code
package router import ( "net/http" "github.com/durban89/wiki/controllers" ) // RouterMap 路由 type RouterMap struct { Path string Fn func(http.ResponseWriter, *http.Request) } // RouterMaps 路由列表 var RouterMaps = []*RouterMap{ { Path: "/view/", Fn: controllers.ArticleViewWithID, }, { Path: "/save/", Fn: controllers.ArticleViewWithID, }, { Path: "/edit/", Fn: controllers.ArticleViewWithID, }, { Path: "/upload/", Fn: controllers.UploadHandler, }, { Path: "/postFile/", Fn: controllers.PostFileHandler, }, } // Routes 操做 func Routes() { for i := 0; i < len(RouterMaps); i++ { cRoute := RouterMaps[i] http.HandleFunc(cRoute.Path, cRoute.Fn) } }
從上面的代碼能夠看出來,路由的管理稍微好一些了,這也就達到了咱們優化main.go文件的目的。regexp
三、測試router
在controllers/article.go文件中添加以下函數
func ArticleViewWithID(w http.ResponseWriter, r *http.Request) { if strings.ToLower(r.Method) == "get" { var validPath = regexp.MustCompile("^/(view)/([a-zA-Z0-9]+)$") m := validPath.FindStringSubmatch(r.URL.Path) if m == nil { http.NotFound(w, r) return } // 獲取文章標題或者文章ID fmt.Println(m[2:]) fmt.Fprintf(w, "Welcome to the home page!") return } http.NotFound(w, r) return }
添加完以後,從新編譯項目並運行,一切正常。
項目更新地址
https://github.com/durban89/typescript_demo.git tag: 1.1.0