Gin框架框架入门

Posted 知其黑、受其白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gin框架框架入门相关的知识,希望对你有一定的参考价值。

阅读目录

一、Gin 介绍

Gin 是一个Go (Golang) 编写的轻量级 http web 框架,运行速度非常快,如果你是性能和高效的追求者,我们推荐你使用Gin 框架。

Gin 最擅长的就是Api 接口的高并发,如果项目的规模不大,业务相对简单,这个时候我们也推荐您使用Gin。

当某个接口的性能遭到较大挑战的时候,这个还是可以考虑使用Gin 重写接口。

Gin 也是一个流行的 golang Web 框架,Github Strat 量已经超过了50k。

Gin 的官网:https://gin-gonic.com/zh-cn/
Gin Github 地址:https://github.com/gin-gonic/gin

二、Gin 环境搭建

要安装Gin 软件包,需要先安装Go 并设置Go 工作区。

1、下载并安装gin:

go get -u github.com/gin-gonic/gin

2、将gin 引入到代码中:

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

3.、(可选)如果使用诸如 http.StatusOK 之类的常量,则需要引入net/http 包:

import "net/http"

4、新建 main.go 配置路由

package main

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

func main() 
	// 创建一个默认的路由引擎
	r := gin.Default()
	// 配置路由
	r.GET("/", func(c *gin.Context) 
		c.JSON(200, gin.H
			"message": "Hello worlds",
		)
	)
	// 启动 HTTP 服务,默认在 0.0.0.0:8080 启动服务
	r.Run()

5、运行你的项目

go run main.go

6、要改变默认启动的端口

r.Run(":9000")

三、golang 程序的热加载

所谓热加载就是当我们对代码进行修改时,程序能够自动重新加载并执行,这在我们开发中是非常便利的,可以快速进行代码测试,省去了每次手动重新编译。

beego 中我们可以使用官方给我们提供的bee 工具来热加载项目,但是gin 中并没有官方提供的热加载工具,这个时候我们要实现热加载就可以借助第三方的工具。

工具1(推荐):https://github.com/gravityblast/fresh

PS E:\\gormlearn\\gormtest> go get github.com/pilu/fresh
go: downloading github.com/pilu/fresh v0.0.0-20190826141211-0fa698148017
go: downloading github.com/mattn/go-colorable v0.1.13
go: downloading github.com/howeyc/fsnotify v0.9.0
go: downloading github.com/pilu/config v0.0.0-20131214182432-3eb99e6c0b9a
go: added github.com/howeyc/fsnotify v0.9.0
go: added github.com/mattn/go-colorable v0.1.13
go: added github.com/pilu/config v0.0.0-20131214182432-3eb99e6c0b9a
go: added github.com/pilu/fresh v0.0.0-20190826141211-0fa698148017
PS E:\\gormlearn\\gormtest>

工具2:https://github.com/codegangsta/gin

PS E:\\gormlearn\\gormtest> go get -u github.com/codegangsta/gin
go: downloading github.com/codegangsta/gin v0.0.0-20211113050330-71f90109db02
go: downloading github.com/urfave/cli v1.22.10
go: downloading github.com/mattn/go-shellwords v1.0.12
go: downloading github.com/codegangsta/envy v0.0.0-20141216192214-4b78388c8ce4
go: downloading github.com/0xAX/notificator v0.0.0-20220220101646-ee9b8921e557
go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d
go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.2
go: downloading github.com/cpuguy83/go-md2man v1.0.10
go: downloading github.com/russross/blackfriday/v2 v2.0.1
go: downloading github.com/russross/blackfriday/v2 v2.1.0
go: downloading github.com/russross/blackfriday v1.6.0
go: downloading github.com/shurcooL/sanitized_anchor_name v1.0.0
go: added github.com/0xAX/notificator v0.0.0-20220220101646-ee9b8921e557
go: added github.com/codegangsta/envy v0.0.0-20141216192214-4b78388c8ce4
go: added github.com/codegangsta/gin v0.0.0-20211113050330-71f90109db02
go: added github.com/cpuguy83/go-md2man/v2 v2.0.2
go: added github.com/mattn/go-shellwords v1.0.12
go: added github.com/russross/blackfriday/v2 v2.1.0
go: added github.com/shurcooL/sanitized_anchor_name v1.0.0
go: added github.com/urfave/cli v1.22.10
PS E:\\gormlearn\\gormtest>

四、Gin 框架中的路由

4.1、路由概述

路由(Routing)是由一个URI(或者叫路径)和一个特定的HTTP 方法(GET、POST 等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。

RESTful API 是目前比较成熟的一套互联网应用程序的API 设计理论,所以我们设计我们的路由的时候建议参考RESTful API 指南。

在RESTful 架构中,每个网址代表一种资源,不同的请求方式表示执行不同的操作:

4.2、简单的路由配置

简单的路由配置(可以通过postman 测试)

当用GET 请求访问一个网址的时候,做什么事情:

r.GET("网址", func(c *gin.Context) 
	c.String(200, "Get")
)

当用POST 访问一个网址的时候,做什么事情:

r.POST("网址", func(c *gin.Context) 
	c.String(200, "POST")
)

当用PUT 访问一个网址的时候,执行的操作:

r.PUT("网址", func(c *gin.Context) 
	c.String(200, "PUT")
)

当用DELETE 访问一个网址的时候,执行的操作:

r.DELETE("网址", func(c *gin.Context) 
	c.String(200, "DELETE")
)

路由里面获取Get 传值

域名 /news?aid=20

r.GET("/news", func(c *gin.Context) 
	aid := c.Query("aid")
	c.String(200, "aid=%s", aid)
)

动态路由

域名 /user/20

r.GET("/user/:uid", func(c *gin.Context) 
	uid := c.Param("uid")
	c.String(200, "userID=%s", uid)
)

4.3、c.String()、c.JSON()、c.JSONP()、c.XML()、c.html()

返回一个字符串

package main

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

func main() 
	r := gin.Default()
	r.GET("/news", func(c *gin.Context) 
		aid := c.Query("aid")
		c.String(200, "aid=%s", aid)
	)
	r.Run(":8080")

返回一个JSON 数据

package main

import (
	"net/http"

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

func main() 
	r := gin.Default()
	// gin.H 是map[string]interface的缩写
	r.GET("/someJSON", func(c *gin.Context) 
		// 方式一:自己拼接JSON
		c.JSON(http.StatusOK, gin.H"message": "Hello world!")
	)
	r.GET("/moreJSON", func(c *gin.Context) 
		// 方法二:使用结构体
		var msg struct 
			Name    string `json:"user"`
			Message string
			Age     int
		
		msg.Name = "IT chen"
		msg.Message = "Hello world!"
		msg.Age = 18
		c.JSON(http.StatusOK, msg)
	)
	r.Run(":8080")

JSOPN

package main

import (
	"net/http"

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

func main() 
	r := gin.Default()
	r.GET("/JSONP", func(c *gin.Context) 
		data := map[string]interface
			"foo": "bar",
		
		// /JSONP?callback=x
		// 将输出:x(\\"foo\\":\\"bar\\")
		c.JSONP(http.StatusOK, data)
	)
	// 监听并在0.0.0.0:8080 上启动服务
	r.Run(":8080")

返回XML 数据

package main

import (
	"net/http"

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

func main() 
	r := gin.Default()
	// gin.H 是map[string]interface的缩写
	r.GET("/someXML", func(c *gin.Context) 
		// 方式一:自己拼接JSON
		c.XML(http.StatusOK, gin.H"message": "Hello world!")
	)
	r.GET("/moreXML", func(c *gin.Context) 
		// 方法二:使用结构体
		type MessageRecord struct 
			Name    string
			Message string
			Age     int
		
		var msg MessageRecord
		msg.Name = "IT chen"
		msg.Message = "Hello world!"
		msg.Age = 18
		c.XML(http.StatusOK, msg)
	)
	r.Run(":8080")

渲染模板

package main

import (
	"net/http"

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

func main() 
	r := gin.Default()
	// 配置模板文件
	r.LoadHTMLGlob("templates/*")

	r.GET("/a", func(c *gin.Context) 
		c.HTML(http.StatusOK,
			"index.html",
			map[string]interface"title": "前台首页")
	)

	r.Run(":8080")

Administrator@DESKTOP-BT1MKQ3 MINGW64 /e/gormlearn
$ tree -C
.
`-- gormtest
    |-- go.mod
    |-- go.sum
    |-- main.go
    `-- templates
        `-- index.html

2 directories, 4 files

Administrator@DESKTOP-BT1MKQ3 MINGW64 /e/gormlearn
$

五、Gin HTML 模板渲染

5.1、全部模板放在一个目录里面的配置方法

1、我们首先在项目根目录新建 templates 文件夹,然后在文件夹中新建 index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>这是一个html 模板</h1>
<h3>.title</h3>
</body>
</html>

2、Gin 框架中使用 c.HTML 可以渲染模板,渲染模板前需要使用 LoadHTMLGlob() 或者 LoadHTMLFiles() 方法加载模板。

package main

import (
	"net/http"

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

func main() 
	r := gin.Default()
	// 配置模板文件
	r.LoadHTMLGlob("templates/*")

	r.GET("/", func(c *gin.Context) 
		c.HTML(http.StatusOK,
			"index.html",
			map[string]interface"title": "前台首页")
	)

	// r.LoadHTMLFiles("templates/index.html", "templates/index.html")

	r.Run(":8080")

Administrator@DESKTOP-BT1MKQ3 MINGW64 /e/gormlearn
$ tree -C
.
`-- gormtest
    |-- go.mod
    |-- go.sum
    |-- main.go
    `-- templates
        `-- index.html

2 directories, 4 files

Administrator@DESKTOP-BT1MKQ3 MINGW64 /e/gormlearn
$

5.2、模板放在不同目录里面的配置方法

Gin 框架中如果不同目录下面有同名模板的话我们需要使用下面方法加载模板。

注意:定义模板的时候需要通过 define 定义名称。

templates/admin/index.html
<!-- 相当于给模板定义一个名字define end 成对出现-->

 define "admin/index.html" 
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>后台模板</h1>
<h3>.title</h3>
</body>
</html>
 end 

templates/home/index.html
<!-- 相当于给模板定义一个名字define end 成对出现-->

 define "home/index.html" 
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>home</h1>
<h3>.title</h3>
</body>
</html>
 end 

业务逻辑

package main

import (
	"net/http"

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

func main() 
	router := gin.Default()

	router.LoadHTMLGlob("templates/**/*")
	router.GET("/", func(c *gin.Context) 
		c.HTML(http.StatusOK, "home/index.html", gin.H
			"title": "前台首页",
		)
	)
	router.GET("/admin", func(c *gin.Context) 
		c.HTML(http.StatusOK, "admin/index.html", gin.H
			"title": "后台首页",
		)
	)

	router.Run(":8080")

注意:如果模板在多级目录里面的话需要这样配置r.LoadHTMLGlob("templates/**/**/*") /** 表示目录。


Administrator@DESKTOP-BT1MKQ3 MINGW64 /e/gormlearn
$ tree -C
.
`-- gormtest
    |-- go.mod
    |-- go.sum
    |-- main.go
    `-- templates
        |-- admin
        |   `-- index.html
        |-- home
        |   `-- index.html
        `-- index.html

4 directories, 6 files

Administrator@DESKTOP-BT1MKQ3 MINGW64 /e/gormlearn
$

5.3、gin 模板基本语法

1、. 输出数据

模板语法都包含在 中间,其中 . 中的点表示当前对象。

当我们传入一个结构体对象时,我们可以根据 . 来访问结构体的对应字段。

例如:业务逻辑

package main

import (
	"net/http"

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

type UserInfo struct 
	Name   string
	Gender string
	Age    int


func main() 
	router := gin.Default()
	router.LoadHTMLGlob("templates/**/*")
	user := UserInfo
		Name:   "张三",
		Gender: "男",
		Age:    18,
	
	router.GET("/", func(c *gin.Context) 
		c.HTML(http.StatusOK, "home/index.html", map[string]interface
			"title": "前台首页",
			"user":  user,
		)

	)
	router.Run(":8080")

模板:E:\\gormlearn\\gormtest\\templates\\home\\index.html

<!-- 相当于给模板定义一个名字define end 成对出现-->

 define "home/index.html" 
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>前台模板</h1>
<h3Gin框架框架入门

带你入门gin框架

Go最火的Gin框架简单入门

Golang Gin 框架入门介绍

Gin框架快速入门

Gin框架快速入门