当前位置: 首页 > 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…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

FOPLP vs CoWoS

以下是 FOPLP&#xff08;Fan-out panel-level packaging 扇出型面板级封装&#xff09;与 CoWoS&#xff08;Chip on Wafer on Substrate&#xff09;两种先进封装技术的详细对比分析&#xff0c;涵盖技术原理、性能、成本、应用场景及市场趋势等维度&#xff1a; 一、技术原…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图&#xff0c;展示模…...