Go基础学习记录 - 编写Web应用程序 - 路由和程序启动的一些思考

近段时间从新对个人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
相关文章
相关标签/搜索