文章目录
一、路由拆分成单独文件或包
当项目的规模增大后就不太适合继续在项目的main.go文件中去实现路由注册相关逻辑了,我们会倾向于把路由部分的代码都拆分出来,形成一个单独的文件或包
1、定义并注册路由
我们在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.topgoer.com!",
})
}
func setupRouter() *gin.Engine {
r := gin.Default()
r.GET("/topgoer", helloHandler)
return r
}
2、main.go文件
在main.go中调用上面定义好的setupRouter函数:
代码如下(示例):
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
e := gin.Default()
r := setupRouter()
if err := r.Run(); err != nil {
fmt.Println("startup service failed, err:%v\n", err)
}
// 运行
e.Run(":8080")
}
3、此时的目录结构:
结果(示例):
4、把路由单独拆分成包
拆分后的目录结构如下:
routers/login.go需要注意此时setupRouter需要改成首字母大写
代码如下(示例):
package routers
import (
"github.com/gin-gonic/gin"
"net/http"
)
func helloHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello111",
})
}
// SetupRouter 配置路由信息
func SetupRouter() *gin.Engine {
r := gin.Default()
r.GET("/topgoer", helloHandler)
return r
}
main.go 代码如下(示例):
package main
import (
"demo/src/routers"
"fmt"
)
func main() {
r := routers.SetupRouter()
if err := r.Run(); err != nil {
fmt.Println("startup service failed, err:%v\n", err)
}
}
5、结果如下:
(示例):
二、路由拆分成多个文件
当我们的业务规模继续膨胀,单独的一个routers文件或包已经满足不了我们的需求了,我们可以分开定义多个路由文件:
1、此时的目录结构:
2、routers/login.go
routers/login.go
中添加一个LoadLogin
的函数,将login
相关的路由注册到指定的路由器:
login.go代码如下(示例):
package routers
import (
"github.com/gin-gonic/gin"
"net/http"
)
func LoadLogin(e *gin.Engine) {
e.GET("/login", login)
}
func login(e *gin.Context) {
e.String(http.StatusOK, "login-登录接口")
}
2、routers/user.go
routers/user.go
中添加一个LoadUser
的函数,将user
相关的路由注册到指定的路由器:
user.go代码如下(示例):
package routers
import (
"github.com/gin-gonic/gin"
"net/http"
)
func LoadUser(e *gin.Engine) {
e.GET("/userinfo", userinfo)
}
func userinfo(e *gin.Context) {
e.String(http.StatusOK, "userinfo-用户详情接口")
}
3、在main函数中实现最终的注册逻辑如下:
main.go代码如下(示例):
package main
import (
"demo/src/routers"
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
routers.LoadUser(r)
routers.LoadLogin(r)
if err := r.Run(); err != nil {
// 输出错误
fmt.Println("startup service failed, err:%v\n", err)
}
}
4、结果如下:
(示例):