一、路由拆分成单独文件或包

当项目的规模增大后就不太适合继续在项目的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.goLoadLoginlogin

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.goLoadUseruser

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、结果如下:

(示例):