3_gin日拱一足---项目拆分 --- 日拱一足系列
项目拆分 — 日拱一足系列
1.将handlerFunc处理函数移除main函数
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
//项目的拆分---第一个阶段 将handlerFunc从main函数中分离出来
r := gin.Default()
r.GET("/index",Handlerindex)
r.Run()
}
func Handlerindex(c *gin.Context){
c.JSON(http.StatusOK,gin.H{
"name": "chenjunde",
"age": 21,
})
}
2.将处理逻辑移出main.go函数
routers.go:
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func setUpRouter()(r *gin.Engine){
r = gin.Default()
r.GET("/index",Handlerindex)
return
}
func Handlerindex(c *gin.Context){
c.JSON(http.StatusOK,gin.H{
"name": "junde",
"age": 21,
})
}
main.go
package main
func main() {
//项目的拆分---第一个阶段 我们将处理逻辑和处理函数从main.go文件中拆除 生成routers.go
r := setUpRouter()
r.Run()
}
3.将路由代码拆分routers包
gin_demo
├── go.mod
├── go.sum
├── main.go
└── routers
└── routers.go
注意将上面的SetUoRouter()函数的首字母变成大写,可以被包外的访问
4.将路由拆分成多个文件
但我们的业务不断变大 一个routers.go不能满足我们的需求(把所有的路由注册都写在SetupRouter函数中)
gin_demo
├── go.mod
├── go.sum
├── main.go
└── routers
├── blog.go
└── shop.go
main函数:
package main
import (
"github.com/gin-gonic/gin"
"text_play/routers"
)
func main() {
//项目的拆分---第四个阶段,我们将不同的路由和业务放在不同的routers文件下
// 比如我们有两个业务线: blog(博客) shop(商城)
r := gin.Default()
routers.Blog(r)
routers.Shop(r)
r.Run()
}
routers包-----blog.go
package routers
import (
"github.com/gin-gonic/gin"
"net/http"
)
func Blog(r *gin.Engine)(){
shop := r.Group("/blog")
shop.GET("/goumai",HandlerGoumai)
shop.GET("/index",HandlerIndex)
}
func HandlerGoumai(c *gin.Context){
c.String(http.StatusOK,"这是购买的处理函数")
}
func HandlerIndex(c *gin.Context){
c.String(http.StatusOK,"这是首页的处理函数")
}
routers包----shop.go
package routers
import (
"github.com/gin-gonic/gin"
"net/http"
)
func Shop(r *gin.Engine)(){
shop := r.Group("/shop")
shop.GET("/goumai",HandlerShop)
shop.GET("/index",HandlerShopIndex)
}
func HandlerShop(c *gin.Context){
c.String(http.StatusOK,"这是购买的处理函数")
}
func HandlerShopIndex(c *gin.Context){
c.String(http.StatusOK,"这是首页的处理函数")
}
5.将不同的业务拆分成不同的APP
比较便于横向的进行扩展
main函数:
package main
import (
"fmt"
"text_play/app/blog"
"text_play/app/shop"
"text_play/routers"
)
func main() {
//将App加载在一个slice切片中
//Init初始化: 初始化*gin.Engine引擎,并且将Engine经过所有的App中执行相关的路由和处理函数
routers.Include(shop.Shop,blog.Blog)
//初始化路由
r := routers.Init()
if err := r.Run(); err != nil {
fmt.Println("start service failed,err:%v\n",err)
}
}
./routers/router.go
package routers
import "github.com/gin-gonic/gin"
type Option func(*gin.Engine)
var options = []Option{}
//注册app的路由配置
func Include(opts ...Option){
options = append(options,opts...)
}
//初始化
func Init() *gin.Engine{
r := gin.New()
for _ ,opt := range options {
opt(r)
}
return r
}
./app/blog/handler.go
package blog
import (
"github.com/gin-gonic/gin"
"net/http"
)
func HandlerGoumai(c *gin.Context){
c.String(http.StatusOK,"这是购买的处理函数")
}
func HandlerIndex(c *gin.Context){
c.String(http.StatusOK,"这是首页的处理函数")
}
./app/blog/router.go
package blog
import (
"github.com/gin-gonic/gin"
)
func Blog(r *gin.Engine)(){
shop := r.Group("/blog")
shop.GET("/goumai",HandlerGoumai)
shop.GET("/index",HandlerIndex)
}