1. 程式人生 > 其它 >gin框架 路由拆分與註冊

gin框架 路由拆分與註冊

★基本的路由註冊

最基礎的gin路由註冊方式,適用於路由條目比較少的簡單專案或者專案demo

package main

import (
    "fmt"
    "net/http"

    "github.com/gin-gonic/gin"
)

func helloHander(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
        "message": "Hello www.topgoer.com!",
    })
}

func main() {
    r := gin.Default()
    r.GET("/topgoer
", helloHander) if err := r.Run(); err != nil { fmt.Printf("startup server failed,err:%v\n", err) } }

★路由拆分成單獨檔案或包

當專案的規模增大後就不太適合繼續在專案的main.go檔案中去實現路由註冊相關邏輯了,我們會傾向於把路由部分的程式碼都拆分出來,形成一個單獨的檔案或包:

我們在routers.go檔案中定義並註冊路由資訊:

package main

import (
    "net/http"

    "github.com/gin-gonic/gin
" ) func helloHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Hello www.ckfuture.com!", }) } func setupRouter() *gin.Engine { r := gin.Default() r.GET("/ckfuture", helloHandler) return r }

此時main.go中呼叫上面定義好的setupRouter函式:

package main

import "fmt"

func main() {
    r :
= setupRouter() if err := r.Run(); err != nil { fmt.Printf("startup service failed,err:%v\n", err) } }

此時的目錄結構:main.go和router.go在相同的資料夾下

把路由部分的程式碼單獨拆分成包的話也是可以的,拆分後的目錄結構如下:

routers/routers.go需要注意此時setupRouter需要改成首字母大寫:

package routers


import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func helloHandler(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
        "message": "Hello www.ckfuture.com!",
    })
}

func SetupRouter() *gin.Engine {
    r := gin.Default()
    r.GET("/ckfuture", helloHandler)
    return r
}

main.go檔案內容如下:

package main

import (
    "fmt"
    "src/main/src/go_code/project01/routers"
)

func main() {
    r := routers.SetupRouter()
    if err := r.Run(); err != nil {
        fmt.Printf("startup service failed,err:%v\n", err)
    }
}

★路由拆分成多個檔案

當我們的業務規模繼續膨脹,單獨的一個routers檔案或包已經滿足不了我們的需求了,因為我們把所有的路由註冊都寫在一個SetupRouter函式中的話就會太複雜了。

我們可以分開定義多個路由檔案,例如:

routers/shop.go中新增一個LoadShop的函式,將shop相關的路由註冊到指定的路由器:

package routers

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func LoadShop(e *gin.Engine) {
    e.GET("/hello", helloHandler)

}
func helloHandler(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
        "message": "Hello www.topgoer.com",
    })
}

routers/blog.go中新增一個LoadBlog的函式,將blog相關的路由註冊到指定的路由器:

package routers

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func LoadBlog(e *gin.Engine) {
    e.GET("/post", postHandler)

}

func postHandler(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
        "message": "Hello www.topgoer.com",
    })
}

在main函式中實現最終的註冊邏輯如下:

package main

import (
    "fmt"
    "src/main/src/routers"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    routers.LoadBlog(r)
    routers.LoadShop(r)
    if err := r.Run(); err != nil {
        fmt.Printf("startup service failed, err:%v\n", err)
    }
}