gin框架教程代码地址:

我们在用http的时候一般都会用一些web框架来进行开发,gin就是这样的一个框架,它有哪些特点呢

一:gin特点

1、性能优秀

2、基于官方的net/http的有限封装

3、方便 灵活的中间件

4、数据绑定很强大

5、社区比较活跃

等等

二:gin的安装

安装:

go get github.com/gin-gonic/gin

如果要更新:

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

三:gin的使用

1、入门的第一个示例

先来写出一个例子:example1.go

package main

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

func main() {

r :=gin.Default()

r.GET("/ping", func(c *gin.Context) {

c.JSON(200, gin.H{"message": "pong",

})

})

r.Run()//listen and serve on 0.0.0.0:8080

}

a. 然后运行 go run example1.go 之后,

b. 在浏览器上输入:http://localhost:8080/ping

输出结果:

{"message":"pong"}

2: gin的基本路由

//创建带有默认中间件的路由:

r :=gin.Default()//创建不带中间件的路由://r := gin.New()

r.GET("/someGet", getting)

r.POST("/somePost", posting)

r.PUT("/somePut", putting)

r.DELETE("/someDelete", deleting)

r.PATCH("/somePatch", patching)

r.HEAD("/someHead", head)

r.OPTIONS("/someOptions", options)

3、获取路由的参数

3.1 Parameters in path

编写param1.go文件

package main

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

"net/http")

func main() {

r :=gin.Default()//这个能匹配 /user/tom , 但是不能匹配 /user/ 或 /user

r.GET("/user/:name", func(c *gin.Context) {

name := c.Param("name")

c.String(http.StatusOK,"Hello %s", name)

})//有一个方法可以匹配 /user/tom, 也可以匹配 /user/tom/send//如果没有任何了路由匹配 /user/tom, 它将会跳转到 /user/tom/

r.GET("/user/:name/*action", func(c *gin.Context) {

name := c.Param("name")

action := c.Param("action")

message := name + "is" +action

c.String(http.StatusOK, message)

})

r.Run(":8080")

}

a. 然后运行 go run param1.go 之后,

b. 在浏览器上输入:http://localhost:8080/user/tom

输出结果:Hello tom

c. 在浏览器上输入:http://localhost:8080/user/tom/

输出结果:tom is /

d. 在浏览器上输入:http://localhost:8080/user/tom/pig

输出结构: tom is /pig

3.2 query param

一般匹配这种形式的url /welcome?firstname=Jane&lastname=Doe

package main//Querystring parameters

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

"net/http")

func main() {

r :=gin.Default()

r.GET("/welcome", func(c *gin.Context) {

firstname := c.DefaultQuery("firstname", "Guest") //如果没有值,还可以给一个默认值

lastname := c.Query("lastname")

c.String(http.StatusOK,"Hello %s %s", firstname, lastname)

})

r.Run(":8080")

}

a. 然后运行 go run param2.go 之后,

b. 在浏览器上输入:http://localhost:8080/welcome?lastname=jimmy

输出结果:Hello Guest jimmy

c. 在浏览器上输入:http://localhost:8080/welcome?lastname=jimmy&firstname=tom

输出结果:Hello tom jimmy

3.3 表单参数 Form

Multipart/Urlencoded Form

package main

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

//"net/http"

)

func main() {

r :=gin.Default()

r.POST("/form_post", func(c *gin.Context) {

message := c.PostForm("message")

nick := c.DefaultPostForm("nick", "guest")

c.JSON(200, gin.H{"status": "posted","message": message,"nick": nick,

})

})

r.Run(":8080")

}

可以用postman来测试一下, 测试结果如下:

3.4 混合型的query + post form

package main

import (//"fmt"

"github.com/gin-gonic/gin")/*POST /post?id=1234&page=1 HTTP/1.1

Content-Type: application/x-www-form-urlencoded

name=manu&message=this_is_great*/func main() {

r :=gin.Default()

r.POST("/post", func(c *gin.Context) {

id := c.Query("id")

page := c.DefaultQuery("page", "0")

name := c.PostForm("name")

message := c.PostForm("message")//fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message)

c.JSON(200, gin.H{"id": id,"page": page,"name": name,"message": message,

})

})

r.Run(":8080")

}

用postman测试结果如下:

4:解析数据绑定

我们可以给一个请求的数据绑定到一个类型,gin支持绑定的类型有JSON,XML和标准的表单数据(foo=bar&boo=baz)。 注意绑定时需要设置绑定类型的标签。比如绑定json数据时,

设置 json:"fieldname"

package main

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

"net/http")//Binding from JSON

type User struct{

Usernamestring `form:"username" json:"username" binding:"required"`

Passwordstring `form:"password" json:"password" binding:"required"`

Ageint `form:"age" json:"age"`

}

func main() {

r :=gin.Default()//Example for binding JSON ({"username": "manu", "password": "123"})

r.POST("/loginJSON", func(c *gin.Context) {varjson Userif err := c.ShouldBindJSON(&json); err ==nil {if json.Username == "manu" && json.Password == "123"{

c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})

}else{

c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized", "username": json.Username, "pass": json.Password})

}

}else{

c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})

}

})//Example for binding a HTML form (user=manu&password=123)

r.POST("/loginForm", func(c *gin.Context) {varform Userif err := c.ShouldBind(&form); err !=nil {if form.Username == "manu" && form.Password == "123"{

c.JSON(http.StatusOK, gin.H{"status": "you are logged in 2"})

}else{

c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized 2"})

}

}else{

c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})

}

})

r.Run(":8080")

}

还有一些其他的应用,可以参考:

gin框架长连接_gin框架教程一: go框架gin的基本使用相关推荐

  1. 高效 保活长连接:手把手教你实现 自适应的心跳保活机制

    前言 当实现具备实时性需求时,我们一般会选择长连接的通信方式 而在实现长连接方式时,存在很多性能问题,如 长连接保活 今天,我将 手把手教大家实现自适应的心跳保活机制,从而能高效维持长连接 目录 1. ...

  2. android 心跳 简书,如何高效维持网络长连接:手把手教你实现 自适应的心跳保活机制...

    前言 当实现具备实时性需求时,我们一般会选择长连接的通信方式 而在实现长连接方式时,存在很多性能问题,如 长连接保活 今天,我将 手把手教大家实现自适应的心跳保活机制,从而能高效维持长连接 目录 示意 ...

  3. gin框架长连接_一个TCP长连接设备管理后台工程(一)

    概述 这个项目最初只是用来进行一个简单的协议测试用的,而且是一个纯粹的后端命令行工程.只是后面想着只有命令行,操作也不太方便,于是便有了添加一个ui的想法. golang项目要配ui,最佳的还是配一个 ...

  4. gin框架长连接_[Golang] Gin框架学习笔记

    0x0 Gin简介 1.Gin 是什么? Gin 是一个用 Go (Golang) 编写的 HTTP web 框架. 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httpr ...

  5. MySQL之长连接、短连接、连接池(转载:http://www.ywnds.com/?p=9801)

    当数据库服务器和客户端位于不同的主机时,就需要建立网络连接来进行通信.客户端必须使用数据库连接来发送命令和接收应答.数据.通过提供给客户端数据库的驱动指定连接字符串后,客户端就可以和数据库建立连接了. ...

  6. MySQL性能优化知识:长连接、短连接、连接池

    当数据库服务器和客户端位于不同的主机时,就需要建立网络连接来进行通信.客户端必须使用数据库连接来发送命令和接收应答.数据.通过提供给客户端数据库的驱动指定连接字符串后,客户端就可以和数据库建立连接了. ...

  7. 【TCP长连接】使用TCP长连接提升服务性能

    1.概述 在<性能优化篇-理论基础>中,我们知道了提升服务性能的两个思路,分别是提升服务并发能力和降低请求的响应时间(RT).一个请求的响应时间包括两部分,等待时间和执行时间.在<性 ...

  8. 【性能优化】网络编程 - PHP - 使用TCP长连接的一种优化思路 - 学习/实践

    1.应用场景 主要了解学习如何基于PHP使用TCP长连接的一种优化思路. 2.学习/参考 文档阅读 PHP - CGI, Fast-FGI, PHP-FPM - 学习/实践 php使用tcp长连接的一 ...

  9. python使用socket实现协议TCP长连接框架

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 使用python实现协议中常见的TCP长连接框架." 分析多了协议就会发现,很多的应用,特别是游戏类和IM类应用,它们的协议会使用 ...

最新文章

  1. 【学时总结】◆学时·VIII◆ 树形DP
  2. python求函数曲率_【Python】车道线拟合曲线的曲率半径计算公式及代码
  3. GDCM:gdcm::Decoder的测试程序
  4. 10月13日学习内容整理:线程,创建线程(threading模块),守护线程,GIL(全局解释器互斥锁)...
  5. 化学到底有多难难难难!为了让学生搞懂化学,竟然...
  6. stm32 I2C架构
  7. JavaScript基础之'script'Tag的使用
  8. exc导入mysql phpcms_PHP如何将EXCEL导入MYSQL,急!!!急!!哪位大师能帮帮忙啊,给个详细代码...
  9. python用什么来写模块-用Python编写模块有何技巧?
  10. 51单片机仿真——蜂鸣器
  11. 【C++】代码实现:数据线性平滑算法:3点线性平滑、5点(1次、2次、3次)线性平滑、7点(1次、2次)线性平滑
  12. 基于ZYNQ wifi方案实现与测试
  13. 2021-2027全球及中国G Suite销售软件行业研究及十四五规划分析报告
  14. 解决对话框的圆角背景图片黑色部分
  15. 【lepus】开源数据库监控rhel8.4安装教程(包含开机脚本)
  16. @Deprecated的使用
  17. Android 9.0 wifi的随机mac地址修改为固定不变
  18. 工程建设项目全套流程,门清!
  19. 人工蜂群算法(ABC算法)
  20. 带你全面掌握高级知识点!一个本科渣渣是怎么逆袭从咸鱼到Offer收割机的?年薪50W

热门文章

  1. “不允许对64位应用程序进行修改”的解决方法 --“Changes to 64-bit applications are not allowed.”
  2. 【玩转server 2019系列】Windows server 2019打开windows defender提示“需要新应用打开windows defender”的解决方法
  3. 安装.Net Framework 4.6.2时出现“无法建立到信任根颁发机构的证书链”解决方法
  4. pip安装提示PermissionError: [WinError 5]错误问题解决
  5. fastJson反序列化异常,JSONException: expect ‘:‘ at 0, actual =
  6. 织梦站内选择和文件管理器中文乱码的解决方法(utf8编码程序包才会)
  7. 检查值是否是JavaScript中的对象
  8. 获得插入行身份的最佳方法?
  9. PHP守护进程常用方法
  10. iOS Swift UISearchController的取消按钮