路由

Go一般使用Gin插件来启动服务并管理路由。 写法很简单,但是我这里更推崇按照模块去做切割(虽然 Go 最终编译时会把被引用到的代码一起打进二进制,但源码层面按模块拆分,维护起来会更清晰)。

主程序

main.go
import "xxx/routers"

func main() {
	// 注册路由
	r := routers.InitRouter()
	// 启动服务
	r.Run()
}

路由定义

routers
    | -- index.go
    | -- root.go
    | -- user.go
index.go
// InitRouter 路由注册清单
func InitRouter() *gin.Engine {
    r := gin.Default()
	// 解决跨域,配置 CORS 中间件
	r.Use(cors.New(cors.Config{
		// 允许的域名,如果不追求极致安全,可以先用 AllowAllOrigins: true
		AllowAllOrigins:  true,
		AllowMethods:     []string{"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"},
		AllowHeaders:     []string{"Origin", "Content-Type", "Accept", "Authorization"},
		ExposeHeaders:    []string{"Content-Length"},
		AllowCredentials: true, // 是否允许携带 Cookie
		MaxAge:           12 * time.Hour,
	}))

    // 注册子路由
	api := r.Group("/api")

	{
		RegisterRootRoutes(api)
		RegisterUserRoutes(api)

	}
	return r
}
root.go
func RegisterRootRoutes(router *gin.RouterGroup) {
	router.GET("", func(c *gin.Context) {
		htmlContent := "<div>你好,  Galaxy Wisdom PO </div>"
		c.Data(200, "text/html; charset=utf-8", []byte(htmlContent))
	})
	router.GET("/hello", func(c *gin.Context) {
		c.JSON(200, gin.H{"status": "i am hello"})
	})
}
user.go
package routers

import (
	_ "be-go/model"
	"be-go/service"
	"be-go/utils"
	"strconv"

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

// 实例化user服务
var userService = &service.UserService{}

// GetUser 获取用户列表
// @Summary      获取用户列表
// @Description  获取用户列表,支持分页
// @Tags User
// @Param        current  query  int  false  "当前页码 (默认1)"
// @Param        size     query  int  false  "每页条数 (默认10)"
// @Success      200  {object}  utils.JsonResult{data=model.PageResult[model.UserVO]}
// @Router       /user [get]
func getUser(c *gin.Context) {
	currentStr := c.Query("current")
	sizeStr := c.Query("size")
	current, _ := strconv.Atoi(currentStr)
	size, _ := strconv.Atoi(sizeStr)

	res, err := userService.GetList(current, size)
	if err != nil {
		utils.ResultFail(c, err.Error())
		return
	}
	utils.ResultOk(c, res)
}

func RegisterUserRoutes(g *gin.RouterGroup) {
	router := g.Group("/user")
	{
		router.GET("", getUser)
	}
}