Gin学习笔记
Gin文档:https://pkg.go.dev/github.com/gin-gonic/gin
1、快速入门
1.1、安装Gin
go get -u github.com/gin-gonic/gin
1.2、main.go
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
// 创建路由引擎
r := gin.Default()
// 添加路由监听
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello Gin!")
})
//启用 web 服务
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
2、配置热更新
Air文档:https://github.com/cosmtrek/air
2.1、下载
# 添加air包
go get -u github.com/cosmtrek/air
# 编译并安装air到 $GOPATH/bin 目录(重启一下Goland)
go install github.com/cosmtrek/air@latest
2.2、使用
# 直接使用air即可热加载
air
3、响应数据
3.1、String
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.LoadHTMLGlob("./template/*.html")
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello Gin!")
})
r.GET("/hello", func(c *gin.Context) {
//c.JSON(http.StatusOK, map[string]interface{}{
// "name": "xumeng03",
// "age": "24",
//})
c.JSON(http.StatusOK, gin.H{
"name": "xumeng03",
"age": "24",
})
})
r.GET("/gin", func(c *gin.Context) {
c.HTML(http.StatusOK, "gin.html", gin.H{
"path": c.FullPath(),
})
})
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
3.2、JSON
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/hello", func(c *gin.Context) {
//c.JSON(http.StatusOK, map[string]interface{}{
// "name": "xumeng03",
// "age": "24",
//})
c.JSON(http.StatusOK, gin.H{
"name": "xumeng03",
"age": "24",
})
})
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
3.3、HTML
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.LoadHTMLGlob("./template/*.html")
r.GET("/gin", func(c *gin.Context) {
c.HTML(http.StatusOK, "gin.html", gin.H{
"path": c.FullPath(),
})
})
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Gin Study</title>
</head>
<body>
<h1>Gin Study!</h1>
<p>请求路径:{{.path}}</p>
</body>
</html>
4、请求数据
4.1、Get
1、直接查询
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
// Query 查询 request 的参数,DefaultQuery 同样查询 request 的参数但若未查询到则赋一个默认值
//var name = c.Query("name")
var name = c.DefaultQuery("name", "Gin")
c.String(http.StatusOK, "Hello %s!", name)
})
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
2、绑定到结构体
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
var person = Person{}
err := c.ShouldBind(&person)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"status": 500,
"message": "Params Error!",
})
return
}
c.JSON(http.StatusOK, gin.H{
"status": 200,
"data": person,
})
})
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
type Person struct {
Name string `json:"name" form:"name"`
Age string `json:"age" form:"age"`
}
4.2、Post
1、直接查询
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.POST("/", func(c *gin.Context) {
// PostForm 查询 request 的参数,DefaultPostForm 同样查询 request 的参数但若未查询到则赋一个默认值
var name = c.PostForm("name")
var age = c.DefaultPostForm("age", "20")
c.String(http.StatusOK, "Hello %s %s!", name, age)
})
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
2、绑定到结构体(form-data)
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.POST("/", func(c *gin.Context) {
var person = Person{}
err := c.ShouldBind(&person)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"status": 500,
})
return
}
c.JSON(http.StatusOK, gin.H{
"status": 500,
"data": person,
})
})
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
type Person struct {
Name string `json:"name" form:"name"`
Age string `json:"age" form:"age"`
}
3、绑定到结构体(json)
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.POST("/json", func(c *gin.Context) {
var person = Person{}
err := c.ShouldBindJSON(&person)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"status": 500,
})
return
}
c.JSON(http.StatusOK, gin.H{
"status": 200,
"data": person,
})
})
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
type Person struct {
Name string `json:"name" form:"name"`
Age string `json:"age" form:"age"`
}
5、Restful
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 删除,DELETE
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/get/:name", func(c *gin.Context) {
param := c.Param("name")
c.String(http.StatusOK, "Hello get %s!", param)
})
r.POST("/post/:name", func(c *gin.Context) {
param := c.Param("name")
c.String(http.StatusOK, "Hello post %s!", param)
})
r.PUT("/put/:name", func(c *gin.Context) {
param := c.Param("name")
c.String(http.StatusOK, "Hello put %s!", param)
})
r.DELETE("/delete/:name", func(c *gin.Context) {
param := c.Param("name")
c.String(http.StatusOK, "Hello delete %s!", param)
})
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
6、路由分组
6.1、基本使用
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
group := r.Group("/restful0")
{
group.GET("/get/:name", func(c *gin.Context) {
param := c.Param("name")
c.String(http.StatusOK, "Hello get %s!", param)
})
group.POST("/post/:name", func(c *gin.Context) {
param := c.Param("name")
c.String(http.StatusOK, "Hello post %s!", param)
})
}
group1 := r.Group("/restful1")
{
group1.PUT("/put/:name", func(c *gin.Context) {
param := c.Param("name")
c.String(http.StatusOK, "Hello put %s!", param)
})
group1.DELETE("/delete/:name", func(c *gin.Context) {
param := c.Param("name")
c.String(http.StatusOK, "Hello delete %s!", param)
})
}
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
6.2、拆分文件
package main
import (
"ginstudy/router"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
router.Restful0(r)
router.Restful1(r)
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
package router
import (
"github.com/gin-gonic/gin"
"net/http"
)
func Restful0(r *gin.Engine) {
group := r.Group("/restful0")
{
group.GET("/get/:name", func(c *gin.Context) {
param := c.Param("name")
c.String(http.StatusOK, "Hello get %s!", param)
})
group.POST("/post/:name", func(c *gin.Context) {
param := c.Param("name")
c.String(http.StatusOK, "Hello post %s!", param)
})
}
}
package router
import (
"github.com/gin-gonic/gin"
"net/http"
)
func Restful1(r *gin.Engine) {
group1 := r.Group("/restful1")
{
group1.PUT("/put/:name", func(c *gin.Context) {
param := c.Param("name")
c.String(http.StatusOK, "Hello put %s!", param)
})
group1.DELETE("/delete/:name", func(c *gin.Context) {
param := c.Param("name")
c.String(http.StatusOK, "Hello delete %s!", param)
})
}
}
7、自定义控制器
7.1、目录结构
7.2、router
app.go
package app
import (
"ginstudy/controller/app"
"github.com/gin-gonic/gin"
)
func AppApi(r *gin.Engine) {
group := r.Group("/app/api")
appController := app.AppController{}
group.GET("/", appController.Index)
}
web.go
package web
import (
"ginstudy/controller/web"
"github.com/gin-gonic/gin"
)
func WebApi(r *gin.Engine) {
group := r.Group("/web/api")
webController := web.WebController{}
group.GET("/", webController.Index)
}
7.3、controller
app.go
package app
import (
"ginstudy/controller"
"github.com/gin-gonic/gin"
)
type AppController struct {
controller.StandardController
}
func (app AppController) Index(c *gin.Context) {
//c.String(http.StatusOK, "Hello App Api!")
app.Success(c)
}
web.go
package web
import (
"ginstudy/controller"
"github.com/gin-gonic/gin"
)
type WebController struct {
controller.StandardController
}
func (web WebController) Index(c *gin.Context) {
//c.String(http.StatusOK, "Hello Web Api!")
web.Success(c)
}
standard.go
package controller
import (
"github.com/gin-gonic/gin"
"net/http"
)
type StandardController struct{}
func (standard StandardController) Success(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"status": 200,
})
}
func (standard StandardController) Error(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"status": 500,
})
}
7.4、main
package main
import (
"ginstudy/router/app"
"ginstudy/router/web"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
app.AppApi(r)
web.WebApi(r)
err := r.Run()
if err != nil {
return
}
}
7.5、go.mod
module ginstudy
go 1.20
require (
dario.cat/mergo v1.0.0 // indirect
github.com/bep/godartsass v1.2.0 // indirect
github.com/bep/godartsass/v2 v2.0.0 // indirect
github.com/bep/golibsass v1.1.1 // indirect
github.com/bytedance/sonic v1.10.2 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
github.com/chenzhuoyu/iasm v0.9.1 // indirect
github.com/cli/safeexec v1.0.1 // indirect
github.com/cosmtrek/air v1.49.0 // indirect
github.com/creack/pty v1.1.20 // indirect
github.com/fatih/color v1.15.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.9.1 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.16.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/gohugoio/hugo v0.120.3 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
github.com/spf13/afero v1.10.0 // indirect
github.com/tdewolff/parse/v2 v2.7.4 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.11 // indirect
golang.org/x/arch v0.6.0 // indirect
golang.org/x/crypto v0.14.0 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/sys v0.14.0 // indirect
golang.org/x/text v0.14.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)