2024年9月

1 假设我们需要开发的接口有这些 package main

import ( "net/http"

"github.com/gin-gonic/gin"

) func main() { r := gin.Default()

r.GET("/", func(c *gin.Context) {
	c.String(200, "首页")
})

r.GET("/news", func(c *gin.Context) {
	c.String(200, "新闻")
})

r.GET("/api", func(c *gin.Context) {
	c.String(200, "我是一个api接口")
})
r.GET("/api/userlist", func(c *gin.Context) {
	c.String(200, "我是一个api接口")
})
r.GET("/api/plist", func(c *gin.Context) {
	c.String(200, "我是一个api接口")
})
r.GET("/api/cart", func(c *gin.Context) {
	c.String(200, "我是一个api接口")
})

r.GET("/admin", func(c *gin.Context) {
	c.String(200, "后台首页")
})
r.GET("/admin/user", func(c *gin.Context) {
	c.String(200, "用户列表")
})
r.GET("/admin/user/add", func(c *gin.Context) {
	c.String(200, "增加用户")
})
r.GET("/admin/user/edit", func(c *gin.Context) {
	c.String(200, "修改用户")
})
r.GET("/admin/article", func(c *gin.Context) {
	c.String(200, "新闻列表")
})

r.Run(":8000")

}

/* 这样的路由对于开发人员来说维护起来是非常困难的 这时我们就需要使用到路由组 */ 2 使用Group分组 package main

import ( "net/http"

"github.com/gin-gonic/gin"

)

func main() { r := gin.Default()

defaultRouters := r.Group("/")
{
	defaultRouters.GET("/", func(c *gin.Context) {
		c.String(200, "首页")
	})

	defaultRouters.GET("/news", func(c *gin.Context) {
		c.String(200, "新闻")
	})
}

apiRouters := r.Group("/api")
{
	apiRouters.GET("/", func(c *gin.Context) {
		c.String(200, "我是一个api接口")
	})
	apiRouters.GET("/userlist", func(c *gin.Context) {
		c.String(200, "我是一个api接口userlist")
	})
	apiRouters.GET("/plist", func(c *gin.Context) {
		c.String(200, "我是一个api接口plist")
	})
	apiRouters.GET("/cart", func(c *gin.Context) {
		c.String(200, "我是一个api接口cart")
	})
}

adminRouters := r.Group("/admin")
{
	adminRouters.GET("/", func(c *gin.Context) {
		c.String(200, "后台首页")
	})
	adminRouters.GET("/user", func(c *gin.Context) {
		c.String(200, "用户列表")
	})
	adminRouters.GET("/user/add", func(c *gin.Context) {
		c.String(200, "增加用户")
	})
	adminRouters.GET("/user/edit", func(c *gin.Context) {
		c.String(200, "修改用户")
	})
	adminRouters.GET("/article", func(c *gin.Context) {
		c.String(200, "新闻列表")
	})
}

r.Run(":8000")

} 3 路由分离 首先我们创建一个routers文件夹,用于存放我们的路由,然后创建3个go文件按模块分别存储路由信息 pFFtBKs.png

接下来就开始分离路由,将相同模块的路由放一起,通过向函数中传递一个 r 的指针进行路由注册

adminRouters.go

package routers

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

func AdminRoutersInit(r *gin.Engine) { adminRouters := r.Group("/admin") { adminRouters.GET("/", func(c *gin.Context) { c.String(200, "后台首页") }) adminRouters.GET("/user", func(c *gin.Context) { c.String(200, "用户列表") }) adminRouters.GET("/user/add", func(c *gin.Context) { c.String(200, "增加用户") }) adminRouters.GET("/user/edit", func(c *gin.Context) { c.String(200, "修改用户") }) adminRouters.GET("/article", func(c *gin.Context) { c.String(200, "新闻列表") }) } } apiRouters.go

package routers

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

func ApiRoutersInit(r *gin.Engine) { apiRouters := r.Group("/api") { apiRouters.GET("/", func(c *gin.Context) { c.String(200, "我是一个api接口") }) apiRouters.GET("/userlist", func(c *gin.Context) { c.String(200, "我是一个api接口userlist") }) apiRouters.GET("/plist", func(c *gin.Context) { c.String(200, "我是一个api接口plist") }) apiRouters.GET("/cart", func(c *gin.Context) { c.String(200, "我是一个api接口cart") }) } } defaultRouters.go

package routers

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

func DefaultRoutersInit(r *gin.Engine) { defaultRouters := r.Group("/") { defaultRouters.GET("/", func(c *gin.Context) { c.String(200, "首页") })

	defaultRouters.GET("/news", func(c *gin.Context) {
		c.String(200, "新闻")
	})
}

} main.go

package main

import ( "awesomeProject/gin/routers" "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() routers.AdminRoutersInit(r) routers.ApiRoutersInit(r) routers.DefaultRoutersInit(r) r.Run(":8000") } 4 小结 /* 目前我们已经可以将路由根据模块功能进行划分出来,区分开,方便后期的维护管理 但是我们只想要路由文件中只有路由的配置,不想要业务逻辑的实现,那我们还得将路由和业务逻辑进行拆分 需要将func单独写到一个文件下面方便管理,这些内容下一篇文章将进行解决

如果熟悉 python 的 Django的话应该是非常容易理解的

*/


Gin控制器分离 1 函数式 /* apiRouters.GET("/", func(c *gin.Context) { c.String(200, "我是一个api接口") }) 这样的一个路由注册我们发现,后面都跟了一个匿名函数,那我们将这个匿名函数全部取出来放在一个固定的地方就可以实现路由和业务逻辑的分离了 */ 1.1 将adminRouters.go中的业务逻辑全部取出 创建一个controllers文件夹,按照模块创建相应的文件夹以及文件,这些文件我们就用来存储相应的业务逻辑

pFFUEtK.png

admin.go 还需要加上函数名

package admin

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

func AdminIndex(c *gin.Context) { c.String(200, "后台首页") }

func AdminUser(c *gin.Context) { c.String(200, "用户列表") }

func AdminUserAdd(c *gin.Context) { c.String(200, "增加用户") }

func AdminUserEdit(c *gin.Context) { c.String(200, "修改用户") }

func AdminNews(c gin.Context) { c.String(200, "新闻列表") } / 将业务逻辑全部写在一起方便管理 */ adminRouter.go

/* 回到路由配置中 */

package routers

import ( "github.com/gin-gonic/gin"

"awesomeProject/gin/controllers/admin"

)

func AdminRoutersInit(r *gin.Engine) { adminRouters := r.Group("/admin") { adminRouters.GET("/", admin.AdminIndex) adminRouters.GET("/user", admin.AdminUser) adminRouters.GET("/user/add", admin.AdminUserAdd) adminRouters.GET("/user/edit", admin.AdminUserEdit) adminRouters.GET("/article", admin.AdminNews) } }

/* 不需要加() 加()了的话就变成了执行函数了 */ 2 结构体式 做法很简单,我们只需要将具体的业务逻辑写在结构体中就行了

api.go

package api

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

type ApiController struct{}

func (con ApiController) Api(c *gin.Context) { c.String(200, "我是一个api接口") }

func (con ApiController) ApiUserList(c *gin.Context) { c.String(200, "我是一个api接口userlist") }

func (con ApiController) ApiPlist(c *gin.Context) { c.String(200, "我是一个api接口plist") }

func (con ApiController) ApiCart(c *gin.Context) { c.String(200, "我是一个api接口cart") } apiRouters.go

package routers

import ( "awesomeProject/gin/controllers/api" "github.com/gin-gonic/gin" )

func ApiRoutersInit(r *gin.Engine) { apiRouters := r.Group("/api") { apiRouters.GET("/", api.ApiController{}.Api) apiRouters.GET("/userlist", api.ApiController{}.ApiUserList) apiRouters.GET("/plist", api.ApiController{}.ApiPlist) apiRouters.GET("/cart", api.ApiController{}.ApiCart) } }


即使把微屁恩开启全局模式,在Android Studio下仍然提示Download Gradle失败,或者下载速度非常非常慢。

这时候可以点击下载进度条,在弹出Build之类的窗口可以看到下载链接,类似于https://services.gradle.org/distributions/gradle-8.2-all.zip,我们复制这个链接到迅雷或者浏览器,可以快速下载下来。

然后得到这个压缩包,用everything搜索gradle关键词,可以在电脑找到类似于:

C:\Users\Administrator.gradle\wrapper\dists\gradle-8.2-bin\bbg7u40eoinfdyxsxr3z4i7ta

的临时目录,把压缩包复制到这个目录。

重启Android Studio,等待它自动配置完成。 作者:bcbooo https://www.bilibili.com/read/cv31740586/ 出处:bilibili