Go语言Gin框架路由详解:从入门到精通

文摘   2024-11-10 16:01   河南  

Go语言作为一门快速、高效的编程语言,受到越来越多开发者的青睐。为了提高开发效率,优化代码结构,很多开发者选择使用框架来快速搭建应用。

在Go语言的世界中,有许多优秀的框架可供选择。本文将详细介绍Go语言Gin框架实战教程,同时还为大家提供了一套Go框架学习资料,包含gin框架、Echo框架、lris框架、Go Web编程以及beego中文文档,共5套资料,领取方式如下!

上述资源如何获取?
扫码加我好友
备注:go框架合集

扫码100%免费领取
一、基本路由传参
1、基本路由
  • gin框架中采用的路由库是基于httprouter做的
  • 地址为:https://github.com/julienschmidt/httproute
package main
import ( "net/http" "github.com/gin-gonic/gin")
func main() { r :=gin.Default() r.Get("/",func(c *gin.Context){      c.String(http.StatusOk,"hello word") })    r.POST("/xxxpost",getting) r.PUT("/xxxput") //监听端口默认为8080 r.Run(":8000")
}

2、API参数

  • 可以通过Context的Param方法来获取API参数

  • localhost:8000/xxx/Snail

package main
import ( "github.com/gin-gonic/gin" "net/http" "strings")
func main () { r := gin.Default()   r.GET("/user/:name/*action", func(c *gin.Context) { name := c.Param("name") action := c.Param("action") //截取/ action = strings.Trim(action, "/") c.String(http.StatusOK, name+" blog: "+action) }) //默认为监听8080端口 r.Run(":8000")}
  • http://127.0.0.1:8000/user/tom/v5blog.com

3、UPL参数

  • UPL参数可以通过DefaultQuery()或Query()方法获取

  • DefaultQuery()若参数不存在,则返回默认值,Query()若不存在,返回空串

  • http://127.0.0.1:8080/user?name=snail

package main
import ( "fmt" "github.com/gin-gonic/gin" "net/http")
func main() { r :=gin.Default() r.GET("/user",func(c *gin.Context){      //http://127.0.0.1:8080/user?name=snail才会打印出来默认的值      name := c.DefaultQuery("name","xxx")      c.String(http.StatusOk,fmt.Sprintf("hello %s",name)) }) r.Run()}
4、routes Group
  • routes group是为了管理一些相同的URL
package main
import ( "github.com/gin-gonic/gin" "fmt")
// gin的helloWorldfunc main() { // 1.创建路由 // 默认使用了2个中间件Logger(), Recovery() r := gin.Default() // 路由组1 ,处理GET请求 v1 := r.Group("/v1") // {} 是书写规范 { v1.GET("/login", login) v1.GET("submit", submit) } v2 := r.Group("/v2") { v2.POST("/login", login) v2.POST("/submit", submit) } r.Run(":8000")}
func login(c *gin.Context) { name := c.DefaultQuery("name", "jack") c.String(200, fmt.Sprintf("hello %s\n", name))}
func submit(c *gin.Context) { name := c.DefaultQuery("name", "lily") c.String(200, fmt.Sprintf("hello %s\n", name))}
5、重定向
  • HTTP重定向
r.GET("/test", func(c *gin.Context) {  c.Redirect(http.StatusMovedPermanently, "http://www.sogo.com/")})
  • 路由重定向
r.GET("/test", func(c *gin.Context) {    // 指定重定向的URL    c.Request.URL.Path = "/test2"    r.HandleContext(c)})r.GET("/test2", func(c *gin.Context) {    c.JSON(http.StatusOK, gin.H{"hello": "world"})})
二、路由拆分成单独文件或包
1、项目结构
  • 把路由部分的代码单独拆分成包的话也是可以的,拆分后的目录结构如下
  • routers/routers.go需要注意此时SetupRouter需要改成首字母大写
gin_demo├── main.go└── routers    └── routers.go
2、main.go
package mainimport (  "fmt"  "gin_test/routers")
func main() { r := routers.SetupRouter() if err := r.Run(); err != nil { fmt.Println("startup service failed, err:%v\n", err) }}

3、routers/routers.go

package routersimport (  "github.com/gin-gonic/gin"  "net/http")
func helloHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Hello v5blog.com", })}
// SetupRouter 配置路由信息func SetupRouter() *gin.Engine { r := gin.Default() r.GET("/", helloHandler) return r}
三、路由拆分成多个文件
1、项目结构
  • 当我们的业务规模继续膨胀,单独的一个routers文件或包已经满足不了我们的需求了
  • 因为我们把所有的路由注册都写在一个SetupRouter函数中的话就会太复杂了
  • 我们可以分开定义多个路由文件
gin_demo├── main.go└── routers    ├── blog.go    └── shop.go

2、main.go

func main() {    r := gin.Default()    routers.LoadBlog(r)    routers.LoadShop(r)    if err := r.Run(); err != nil {        fmt.Println("startup service failed, err:%v\n", err)    }}

3、routers/blog.go

  • routers/blog.go中添加一个LoadBlog的函数,将blog相关的路由注册到指定的路由器

package routersimport (  "github.com/gin-gonic/gin"  "net/http")
func LoadBlog(e *gin.Engine) { e.GET("/blog", blogHandler)}
func blogHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Blog Router", })}

4、routers/shop.go

  • routers/shop.go中添加一个LoadShop的函数,将shop相关的路由注册到指定的路由器

package routersimport (  "github.com/gin-gonic/gin"  "net/http")
func LoadShop(e *gin.Engine) { e.GET("/shop", shopHandler)}
func shopHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Shop Router", })}
四、路由拆分到不同的APP
1、项目结构
  • 有时候项目规模实在太大,那么我们就更倾向于把业务拆分的更详细一些,例如把不同的业务代码拆分成不同的APP
  • 因此我们在项目目录下单独定义一个app目录,用来存放我们不同业务线的代码文件,这样就很容易进行横向扩展
gin_demo├── app│   ├── blog│   │   ├── handler.go│   │   └── router.go│   └── shop│       ├── handler.go│       └── router.go├── main.go└── routers    └── routers.go

2、main.go

package main
import ( "fmt" "gin_demo/app/blog" "gin_demo/app/shop" "gin_demo/routers")
func main() { // 加载多个APP的路由配置 routers.Include(shop.Routers, blog.Routers) // 初始化路由 r := routers.Init() if err := r.Run(); err != nil { fmt.Println("startup service failed, err:%v\n", err) }}

3、routers/routers.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}

4、app/blog

  • app/blog/router.go


package blog
import ( "github.com/gin-gonic/gin")
func Routers(e *gin.Engine) { e.GET("/blog", blogHandler)}
  • app/blog/handler.go

package blog
import ( "github.com/gin-gonic/gin" "net/http")
func blogHandler(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Blog Router", })}

来源:https://mp.weixin.qq.com/s/Hii4JAGCedsunC3XZFiPag

通过深入实践和探索框架的特性和优势,开发人员能够显著提升开发效率,并打造出更加强大、高效的应用程序。

为此,我们精心准备了go框架合集,助您深入了解并选择合适的框架!



 

上述资源如何获取?
扫码加我好友
备注:go框架合集

扫码100%免费领取

抢购!!1分购五重豪礼

干货资料+实战专题
1453页Linux学习笔记
937页kubernetes学习笔记
570个Linux命令大全
web安全学习笔记
kubernetes从入门到实战专题课
五重豪礼仅要1分

Golang在发光
每天为大家分享最新的Golang相关的技术文章、干货资料、语言资讯、语言教程、实战项目等,供大家学习和提升!
 最新文章