gin框架 路由拆分與註冊
阿新 • • 發佈:2021-06-28
★基本的路由註冊
最基礎的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) } }