当前位置: 首页 > news >正文

[golang gin框架] 1.Gin环境搭建,程序的热加载,路由GET,POST,PUT,DELETE

一.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

由于网络原因国内部分用户可能没法直接下载第三方包,go get 失败,Golang Gin中没法下载第三方包解决办法如下:

//打开终端并执行
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

2.将 gin 引入到代码中

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

3. 如果使用诸如 http.StatusOK 之类的常量,则需要引入 net/http 包

import "net/http"

4.新建main.go配置路由

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {
// 创建gin的默认路由引擎
r := gin.Default()
// 配置路由
r.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{ // c.JSON:返回 JSON 格式的数据"message": "Hello world!", })})// 浏览器访问请求127.0.0.1:8080/ping路由时,调用回调函数
r.GET("/ping", func(c *gin.Context) {//浏览器输出//c.JSON(200, gin.H{//    "message": "pong",//})c.String(http.StatusOK, "值:%v", "你好")})//监听并在 0.0.0.0:8080 上启动服务(启动一个web服务)
r.Run()
// 监听并在 0.0.0.0:8000 上启动服务(启动一个web服务)
//r.Run("8000") 
}

5.运行项目

go run main.go

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

r.Run(":9000")

三.golang程序的热加载

所谓热加载就是当对代码进行修改时,程序能够自动重新加载并执行,这在开发中
是非常便利的,可以快速进行代码测试,省去了每次手动重新编译,beego 中可以使用官方给提供bee工具来热加载项目,但是 gin 中并没有官方提供的热加载工具,这个时候要实现热加载就可以借助第三方的工具

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

//进入终端执行
go get github.com/pilu/fresh
//然后运行命令
fresh//或者进入终端执行
go install github.com/pilu/fresh@latest
//然后运行命令
fresh

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

//进入终端执行
go get -u github.com/codegangsta/gin
//然后运行命令
gin run main.go

四.Gin框架中的路由

1.路由概述

路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等)
组成的,涉及到应用如何响应客户端对某个网站节点的访问,RESTful API 是目前比较成熟的一套互联网应用程序的 API 设计理论,所以在设计路由的时候建议参考 RESTful API 指南,在 RESTful 架构中,每个网址代表一种资源,不同的请求方式表示执行不同的操作:

GET(SELECT)

从服务器取出资源(一项或多项)

POST(CREATE)

在服务器新建一个资源

PUT(UPDATE)

在服务器更新资源(客户端提供改变后的完整资源)

DELETE(DELETE)

从服务器删除资源

  1. 简单的路由配置

当用 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)
})
完整的代码案例如下:
package mainimport (_ "fmt""github.com/gin-gonic/gin""net/http"
)func main()  {r := gin.Default()  // 创建gin的默认路由引擎//配置路由// 浏览器访问请求127.0.0.1:8080/ping路由时,调用回调函数r.GET("/ping", func(c *gin.Context) {//浏览器输出//c.JSON(200, gin.H{//    "message": "pong",//})c.String(http.StatusOK, "值:%v", "你好")})r.GET("/news", func(c *gin.Context) {//使用http.StatusOK状态码c.String(http.StatusOK, "新闻页11面")})r.POST("/add", func(c *gin.Context) {c.String(200, "这是一个POST请求,主要用于增加数据")})r.PUT("/edit", func(c *gin.Context) {c.String(200, "这是一个PUT请求,主要用于修改数据")})r.DELETE("/delete", func(c *gin.Context) {c.String(200, "这是一个DELETE请求,主要用于增删除数据")})r.Run() // 监听并在 0.0.0.0:8080 上启动服务(启动一个web服务)
}

3.c.String() c.JSON() c.JSONP() c.XML() c.HTML()

返回一个字符串
r.GET("/news", func(c *gin.Context) {aid := c.Query("aid")c.String(200, "aid=%s", aid)
})
返回一个 JSON 数据
    //方法一:自己拼接JSONr.GET("/json", func(c *gin.Context) {//返回json数据,使用 map[string]interface//c.JSON(返回的状态码, 任意类型的数据(如:map,struct,...)c.JSON(200, map[string]interface{}{"success": true,"msg":     "你好",})})//方法二:gin中的H函数r.GET("/json2", func(c *gin.Context) {//返回json数据,使用gin中的H函数, gin.H 是 map[string]interface{}的缩写c.JSON(200, gin.H{"success": true,"msg":     "你好gin",})})//方法三:使用结构体r.GET("/json3", func(c *gin.Context) {//实例化一个结构体a := &Article{Title:   "标题",Desc:    "说明",Content: "内容",}c.JSON(200, a)})
JSOPN: jsonp请求 主要用来解决跨域问题
    //jsonp请求 主要用来解决跨域问题//http://127.0.0.1:8080/jsonp?callback=call//call({"title":"标题-jsonp","desc":"说明-jsonp","content":"内容-jsonp"});r.GET("/jsonp", func(c *gin.Context) {//实例化一个结构体a := &Article{Title:   "标题-jsonp",Desc:    "说明-jsonp",Content: "内容-jsonp",}c.JSONP(200, a)})
返回 XML 数据
    //方法一:使用gin.H返回r.GET("/xml", func(c *gin.Context) {c.XML(http.StatusOK, gin.H{"success": true,"msg":     "成功xml",})})//方法二:使用结构体r.GET("/xmlStruct", func(c *gin.Context) {//实例化一个结构体a := &Article{Title:   "标题-xmlStruct",Desc:    "说明-xmlStruct",Content: "内容-xmlStruct",}c.XML(200, a)})
返回HTML数据
     //初始化路由r := gin.Default()//加载templates文件中所有模板文件,以便后续c.HTML()渲染文件时使用r.LoadHTMLGlob("templates/*")r.GET("/news", func(c *gin.Context) {//使用模板文件渲染HTML文件//前提: r.LoadHTMLGlob("templates/*")//HTML(状态码, 要渲染的文件名, 加载的参数)c.HTML(http.StatusOK, "news.html", gin.H{"title": "我是一个news",})})
完整代码案例如下:
package mainimport ("github.com/gin-gonic/gin""net/http"
)type Article struct {Title   string `json:"title"`Desc    string `json:"desc"`Content string `json:"content"`
}func main() {//初始化路由r := gin.Default()//加载templates文件中所有模板文件,以便后续c.HTML()渲染文件时使用r.LoadHTMLGlob("templates/*")//配置路由r.GET("/", func(c *gin.Context) {c.String(200, "首页")})r.GET("/json", func(c *gin.Context) {//返回json数据,使用 map[string]interface//c.JSON(返回的状态码, 任意类型的数据(如:map,struct,...)c.JSON(200, map[string]interface{}{"success": true,"msg":     "你好",})})r.GET("/json2", func(c *gin.Context) {//返回json数据,使用gin中的H函数c.JSON(200, gin.H{"success": true,"msg":     "你好gin",})})r.GET("/json3", func(c *gin.Context) {//实例化一个结构体a := &Article{Title:   "标题",Desc:    "说明",Content: "内容",}c.JSON(200, a)})//jsonp请求 主要用来解决跨域问题//http://127.0.0.1:8080/jsonp?callback=call//call({"title":"标题-jsonp","desc":"说明-jsonp","content":"内容-jsonp"});r.GET("/jsonp", func(c *gin.Context) {//实例化一个结构体a := &Article{Title:   "标题-jsonp",Desc:    "说明-jsonp",Content: "内容-jsonp",}c.JSONP(200, a)})r.GET("/xml", func(c *gin.Context) {c.XML(http.StatusOK, gin.H{"success": true,"msg":     "成功xml",})})r.GET("/news", func(c *gin.Context) {//使用模板文件渲染HTML文件//前提: r.LoadHTMLGlob("templates/*")//HTML(状态码, 要渲染的文件名, 加载的参数)c.HTML(http.StatusOK, "news.html", gin.H{"title": "我是一个news",})})r.GET("/goods", func(c *gin.Context) {//使用模板文件渲染HTML文件//前提: r.LoadHTMLGlob("templates/*")//HTML(状态码, 要渲染的文件名, 加载的参数)c.HTML(http.StatusOK, "goods.html", gin.H{"title": "我是一个goods","price": 12.99,})})r.Run() // 启动一个web服务
}

[下一节][golang gin框架] 2.Gin HTML模板渲染以及模板语法,自定义模板函数,静态文件服务

相关文章:

[golang gin框架] 1.Gin环境搭建,程序的热加载,路由GET,POST,PUT,DELETE

一.Gin 介绍Gin 是一个 Go (Golang) 编写的轻量级 http web 框架,运行速度非常快,如果你是性能和高效的追求者,推荐你使用 Gin 框架.Gin 最擅长的就是 Api 接口的高并发,如果项目的规模不大,业务相对简单,这…...

【开源】祁启云网络验证系统V1.11

简介 祁启云免费验证系统 一个使用golang语言、Web框架beego、前端Naive-Ui-Admin开发的免费网络验证系统 版本 当前版本1.11 更新方法 请直接将本目录中的verification.exe/verification直接覆盖到你服务器部署的目录,更新前,请先关闭正在运行的验…...

震源机制(Focal Mechanisms)之沙滩球(Bench Ball)

沙滩球包含如下信息: a - 判断断层类型,可根据球的颜色快速判断 b - 判断断层的走向(strike),倾角(dip) c - 确定滑移角/滑动角(rake) 走向 ,倾角,滑移角 如不了解断层的定义,可以先阅读:震…...

C++入门:多态

多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。1、纯虚函数声明如下: virtual void funtion1()0; 纯…...

华为OD真题_工位序列统计友好度最大值(100分)(C++实现)

题目描述 工位由序列F1,F2…Fn组成,Fi值为0、1或2。其中0代表空置,1代表有人,2代表障碍物。 1、某一空位的友好度为左右连续老员工数之和 2、为方便新员工学习求助,优先安排友好度高的空位 给出工位序列,求所有空位中友好度的最大值。 输入描述 第一行为工位序列:F1,F…...

[ruby on rails]MD5、SHA1、SHA256、Base64、aes-128-cbc、aes-256-ecb

md5 puts Digest::MD5.hexdigest(admin) sha1 require digest/sha1 puts Digest::SHA1.hexdigest(admin)base64 require base64 code Base64.encode64(admin) source Base64.decode64(code)aes-128-cbc # base64 解密数据 session_key Base64.decode64(session_ke…...

《NFL星计划》:拉斯维加斯突袭者·橄榄1号位

拉斯维加斯袭击者(英语: Las Vegas Raiders)又译拉斯维加斯侵略者或拉斯维加斯突击者,是一支主场位于美国内华达州拉斯维加斯的职业美式橄榄球球队,属全国橄榄球联盟 (NFL) 的美国橄榄球联合会 (AFC) 西区。实际上&…...

韩顺平Linux基础学习(1)

内容概括...

Rust学习入门--【6】Rust 基础语法

Rust 基础语法 变量,数据类型,注释,函数和控制流,这些是大部分编程语言都具有的编程概念。 本节将学习理解这些概念。 变量 Rust 是强类型语言,但具有自动判断变量类型的能力。这很容易让人与弱类型语言产生混淆。…...

LINUX提权入门手册

前言 发点存货 LINUX权限简介 在学习提权之前我们先了解一下linux里面的权限我们使用命令: ls -al即可查看列出文件所属的权限: 文件头前面都有一段类似的字符,下面我们仔细分析一下里面符号分别代表什么。 -rw-r--r-- 1 root root 第一个符号-的…...

MSI_MSI-X中断之源码分析

MSI_MSI-X中断之源码分析 文章目录MSI_MSI-X中断之源码分析一、 怎么发出MSI/MSI-X中断1.1 在RK3399上体验1.1.1 安装工具1.1.2 查看设备MSI-X信息1.1.3 验证MSI-X信息二、 怎么使用MSI/MSI-X三、 MSI/MSI-X中断源码分析3.1 IRQ Domain创建流程3.1.1 GIC3.1.2 ITS3.1.3 PCI MSI…...

Docker--consul

目录 前言 一、Consul 简介 1.1、 consul 概述 1.2 、consul 的两种模式 1.3、consul 提供的一些关键特性 二、Consul 容器服务更新与发现 三、consul 部署 3.2、查看集群信息 四、registrator服务器 consul-template 五、consul 多节点 前言 服务注册与发现是微服…...

ESP-01S使用AT指令连接阿里云

ESP-01S使用AT指令连接阿里云 烧录MQTT AT固件 出厂的ESP-01S是基本的AT指令固件,没有MQTT的,所以无法通过MQTT指令与云平台通信,需要烧录固件(如果测试到有MQTT相关的指令,则不用重新烧录固件) 固件烧录…...

【Kafka】【三】安装Kafka服务器

Kafka基本知识 Kafka介绍 Kafka是最初由Linkedin公司开发,是⼀个分布式、⽀持分区的(partition)、多副本的 (replica),基于zookeeper协调的分布式消息系统,它的最⼤的特性就是可以实时的处理 …...

关于适配器模式,我遗漏了什么

近期有些tasks需要 重构or适配 老的代码。 与其向上面堆💩,不如优雅的去解决。 首先我的问题在于,错误的把 堆屎的操作 ,当作了适配器模式的操作。 比如原函数入参,需要更改某个属性,把这种操作外包一层…...

SQL Serve 日志体系结构

SQL Server 事务日志记录着 undo 及 redo 日志,为了保证数据库在崩溃后恢复,或者在正常数据库操作期间进行回滚,保证数据库事务完整性和持久化。如果没有事务日志记录,数据库在事务上将不一致,并且在数据库崩溃后可能导…...

【C++1】函数重载,类和对象,引用,string类,vector容器,类继承和多态,/socket,进程信号,public,ooci

文章目录1.函数重载:writetofile(),Ctrue和false,C0和非02.类和对象:vprintf2.1 构造函数:对成员变量初始化2.2 析构函数:一个类只有一个,不允许被重载3.引用:C中&取地址&#x…...

asio网络编程 tcp、udp、rpc

轻量级的tcp/udp/rpc库,简化socket程序编写。 同时,RPC部分也提供了方便易用的功能。 仓库地址 https://github.com/shuai132/asio_net asio_net a Tiny Async TCP/UDP/RPC library based on ASIO and RpcCore Features 简化TCP、UDP相关程序的编写…...

双目测距------双目相机V1.0,将双目相机采集到任意一点的深度数据进行串口传输(带源码)

Depth2Uart 双目测距------双目相机V1.0,将双目相机采集到任意一点的深度数据进行串口传输 一、项目说明/Overview 所实现的功能:基于Intel Realsense官方提供的SDK,双目深度相机能获取到相机任何一个像素点距离前方障碍物的距离&#xff0…...

jetson nano(ubuntu)安装Cmake

文章目录安装环境一.命令行安装二.Cmake源码编译安装安装环境 jetson nano 系统:4.6.1 一.命令行安装 sudo apt install cmake这种直接安装cmake的方式,其实安装的版本都太老了,这种方式不推荐 二.Cmake源码编译安装 更新一下系统软件 su…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

云原生安全实战:API网关Kong的鉴权与限流详解

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL&#xff08;Software OpenGL&#xff09;‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式&#xff08;包括几何处理、光栅化、着色等&#xff09;&#xff0c;不依赖GPU硬件加速。这种模式通常性能较低&#xff0c;但兼容性极强&#xff0c;常用于不支持硬件加速…...

Cursor AI 账号纯净度维护与高效注册指南

Cursor AI 账号纯净度维护与高效注册指南&#xff1a;解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后&#xff0c;许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...

Oracle实用参考(13)——Oracle for Linux物理DG环境搭建(2)

13.2. Oracle for Linux物理DG环境搭建 Oracle 数据库的DataGuard技术方案,业界也称为DG,其在数据库高可用、容灾及负载分离等方面,都有着非常广泛的应用,对此,前面相关章节已做过较为详尽的讲解,此处不再赘述。 需要说明的是, DG方案又分为物理DG和逻辑DG,两者的搭建…...