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

gin 框架初始教程

一 、gin 入门

1. 安装gin :下载并安装 gin包:

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

2. 将 gin 引入到代码中:

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

3.初始化项目

go mod init gin

4.完整代码

package mainimport "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()
}

5.启动项目

go run main.go  # 运行 main.go 并且在浏览器中访问 0.0.0.0:8080/ping

6.效果图

二、基础知识

  1. go get -u

参数介绍:

  • -d 只下载不安装

  • -f 只有在你包含了 -u 参数的时候才有效,不让 -u 去验证 import 中的每一个都已经获取了,这对于本地 fork 的包特别有用

  • -fix 在获取源码之后先运行 fix,然后再去做其他的事情

  • -t 同时也下载需要为运行测试所需要的包

  • -u 强制使用网络去更新包和它的依赖包

  • -v 显示执行的命

三、gin测试用例

  1. AsciiJSON 生成具有转义的非 ASCII 字符的 ASCII-only JSON。

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main()  {r:=gin.Default()r.GET("/someJson", func(c *gin.Context) {data:=map[string]interface{}{"lang":"go 语言","tag":"<br>",}c.AsciiJSON(http.StatusOK,data)})r.Run(":8081")
}

为什么 浏览器和 终端命令行curl打印出来的结果格式不一样?gin.AsciiJSON

答:编码问题

  1. 绑定HTML复选框

package mainimport "github.com/gin-gonic/gin"type myForm struct {Colors []string `form:"colors[]"`
}func formHandler(c *gin.Context) {var fakeForm myFormc.ShouldBind(&fakeForm)c.JSON(200, gin.H{"color": fakeForm.Colors})
}func innerHandler(c *gin.Context) {c.HTML(200, "form.html", nil)
}func main() {r := gin.Default()r.LoadHTMLGlob("views/*")r.GET("/", innerHandler)r.POST("/", formHandler)r.Run(":8082")
}

views/form.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/" method="POST"><p>Check some colors</p><label for="red">Red</label><input type="checkbox" name="colors[]" value="red" id="red"><label for="green">Green</label><input type="checkbox" name="colors[]" value="green" id="green"><label for="blue">Blue</label><input type="checkbox" name="colors[]" value="blue" id="blue"><input type="submit">
</form>
</body>
</html>
  1. 绑定查询字符串或表单数据

package mainimport ("github.com/gin-gonic/gin""log""time"
)
//表单字符串
type PersonString struct {Name     string    `form:"name"`Address  string    `form:"address" `Birthday time.Time `form:"birthday" time_format:"2006-01-02" time_utc:"1"`
}//请求json格式
type PersonJson struct {Name     string    `json:"name"`Address  string    `json:"address"`Birthday time.Time `json:"birthday" time_format:"2006-01-02" time_utc:"1"`
}func startPage(c *gin.Context) {var person PersonStringerr := c.Bind(&person)//ShouldBind 与 Bind 打印结果一样//err:=c.ShouldBind(&person)if err == nil {log.Println(person.Name)log.Println(person.Address)log.Println(person.Birthday)log.Println("Binding success...")} else {log.Println("Binding failed...")log.Println(err)}var personJson PersonJsonerrJson := c.BindJSON(&personJson)if errJson == nil {log.Println(personJson.Name)log.Println(personJson.Address)//log.Println(personJson.Birthday)log.Println("BindJson success...")} else {log.Println("BindJson failed...")log.Println(errJson)}c.String(200, "success")
}
func main() {log.Println("Hello World")route := gin.Default()route.GET("/testing", startPage)route.Run(":8083")
}

请求:

string:

 curl -X GET "http://0.0.0.0:8083/testing?name=appleboy&address=xyz&birthday=2023-03-15"
打印:结果
success   

josn:

curl -X GET "http://0.0.0.0:8083/testing" --data '{"name":"JJ", "address":"xyz"}' -H "Content-Type:application/json"结果:success

效果图:

  1. 绑定uri

package mainimport "github.com/gin-gonic/gin"type Person struct {ID   string `uri:"id" building:"required,uuid"`Name string `uri:"name" building:"required"`
}func main() {r := gin.Default()r.GET("/:name/:id", func(c *gin.Context) {var person Personif err := c.ShouldBindUri(&person); err != nil {c.JSON(400, gin.H{"msg": err})return}c.JSON(200, gin.H{"name": person.Name, "uuid": person.ID})})r.Run(":8080")}

  1. 控制log 高亮输出,默认开启高亮

//强制log 高亮
gin.ForceConsoleColor()//关闭log高亮
//gin.DisableConsoleColor()

6.自定义http配置:(监听端口,读写时间,最大读写字节数)


func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.String(200, "pong")})//两行作用一样,谁先执行谁生效//r.Run(":8080")//http.ListenAndServe(":8081",r)s := &http.Server{Addr:           ":8084",Handler:        r, //实例句柄ReadTimeout:    10 * time.Second,WriteTimeout:   10 * time.Second,MaxHeaderBytes: 1 << 20,}s.ListenAndServe()
}
  1. 自定义log文件

参考:https://learnku.com/docs/gin-gonic/1.7/examples-bind-uri/11391

相关文章:

gin 框架初始教程

一 、gin 入门1. 安装gin &#xff1a;下载并安装 gin包&#xff1a;$ go get -u github.com/gin-gonic/gin2. 将 gin 引入到代码中&#xff1a;import "github.com/gin-gonic/gin"3.初始化项目go mod init gin4.完整代码package mainimport "github.com/gin-go…...

对象分配策略

对象创建后,究竟何去何从,对象在堆中又会经历哪些过程,本篇就会详细解释对象创建后直到对象被回收的整个过程。之前博主已经写过Minor GC、Major GC、Full GC的区别&#xff0c;而本篇也主要根据这几个GC开展。 对象回收过程流程如下图所示&#xff1a; 正常的对象生存过程&a…...

你可能不知道的前端监控方案

前言 现有的大部分监控方案都是针对服务端的&#xff0c;而针对前端的监控很少&#xff0c;诸如线上页面的白屏时间是多少、静态资源的加载情况如何、接口请求耗时好久、什么时候挂掉了、为什么挂掉&#xff0c;这些都不清楚。 因而&#xff0c;我们需要一个前端的页面监控系…...

java spring AOP 完全注解开发

我们先创建一个项目 然后引入java spring aop的依赖 然后 在src下创建目录 我这里 直接就叫 Aop了 下面创建一个User类 参考代码如下 package Aop;import org.springframework.stereotype.Component;Component public class User {public void add(){System.out.println(&qu…...

ctf pwn基础-4

今天是学pwn的第四天&#xff0c;去接触了pwn的整数溢出。 目录 基础 实例讲解 实例讲解2 基础 关于整数溢出&#xff0c;这里以int为例&#xff0c;因为我php之前搞的比较多&#xff0c;以为这个int也是想php一样是64&#xff0c;最大值是9开头的那个&#xff0c;闹了不少笑…...

bool与引用类型

bool与引用类型bool类型介绍与使用bool(布尔类型)大小&#xff1a;1个字节返回值有两个&#xff1a;1(true)&#xff0c;0(false)#include<iostream>using namespace std;int main() {bool a false;bool b true;cout << "a " << a << end…...

tkinter界面的TCP通信/tkinter开启线程接收TCP

前言 用简洁的语言写一个可以与TCP客户端实时通信的界面。之前做了一个项目是要与PLC进行信息交互的界面&#xff0c;在测试的时候就利用TCP客户端来实验&#xff0c;文末会附上TCP客户端。本文分为三部分&#xff0c;第一部分是在界面向TCP发送数据&#xff0c;第二部分是接收…...

[SQL Statements] 基本的SQL知识 之DDL针对数据库的基本操作

SQL Statements SQL语句的学习 之 DDL针对数据库的基本操作 什么是database 在 MySQL 中&#xff0c;Database&#xff08;数据库&#xff09;是一组有组织的数据集合&#xff0c;可以存储和管理相关数据的容器。一个数据库可以包含多个表&#xff08;Table&#xff09;&…...

Qt的MOC机制

Qt的MOC机制 Qt扩展了C&#xff0c;使得开发者拥有很多方便使用的工具。如何使用Qt提供的特性呢&#xff1f;比如信号与槽&#xff0c;那就需要开发者在类中声明Q_OBJECT宏&#xff0c;这样程序员就能使用Qt提供的功能了。为什么这样可以呢&#xff1f;先从C文件的编译过程开始…...

Linux驱动——设备模型

目录 一、起源 二、新方案 2.1 sysfs: 2.2 uevent 三、代码中自动mknod 四、实例 一、起源 仅devfs&#xff0c;导致开发不方便以及一些功能难以支持&#xff1a;&#xff08;硬编&#xff09; 1. 热插拔&#xff08;插上usb设备就立马能安装驱动&#xff09; 2. 不支持…...

.NET基础加强第一课--面向对象(OO)

.NET基础加强第一课--面向对象&#xff08;OO&#xff09;面向对象什么是类&#xff1f;封装--属性封装字段2&#xff0c; 方法的多个参数封装成一个类3&#xff0c; 把一堆代码封装到一个方法中4&#xff0c; 将一些功能封装到几个类中5&#xff0c; 将一些具有共有功能封装到…...

从Linux源码角度看套接字的Listen及连接队列

今天就从Linux源码的角度看下Server端的Socket在进行listen的时候到底做了哪些事情(基于Linux 3.10内核)&#xff0c;当然由于listen的backlog参数和半连接hash表以及全连接队列都相关&#xff0c;在这里也一块讲了。 Server端Socket需要Listen 众所周知&#xff0c;一个Serv…...

cesium: 显示闪烁的点(004)

第004个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置闪烁的点。主要是介绍entity>point 相关的属性设置 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共107行)相关API参考:专栏目标示例效果 配…...

常见代码审计工具,代码审计为什么不能只用工具?

代码审计是一种发现程序漏洞&#xff0c;安全分析为目标的程序源码分析方式。今天主要分享的是几款常用的代码审计工具&#xff0c;以及代码审计工具有哪些优缺点&#xff1f; 代码审计工具 seay代码审计工具&#xff0c;是一款开源的利用C#开发的一款代码审计工具。主要有SQ…...

es8集群模式部署

准备3台机器 192.168.1.41 192.168.1.42 192.168.1.43因为es集群有几个节点&#xff0c;所以我对应node1&#xff0c;node2&#xff0c;node3.这几个名称并不是主机名&#xff0c;而是es节点名称 2. 开始部署&#xff0c;基础配置 (三台都做) systemctl stop firewalld syste…...

OAuth2

1.什么是OAuth2 OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时&#xff0c;任何第三方都可以使用OAUTH认证服务&#xff0c;任何服务提供商都可以实现自身的OAUTH认证服务&#xff0c;因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP、JavaScript&…...

一、简单排序

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Comparable接口介绍 1.描述 2.Comparable使用 二、冒泡排序 1.排序原理 2.冒泡排序实现 2.1 冒泡排序API 2.2 冒泡排序实现 3.冒泡排序时间复杂度 三…...

慢SQL出现原因、优化、开启慢查询日志

文章目录慢SQL:出现原因&#xff1a;解决方式&#xff1a;开启慢查询日志&#xff1a;慢SQL: 出现原因&#xff1a; &#xff08;1&#xff09;数据库表索引设置不合理 &#xff08;2&#xff09;SQL语句有问题&#xff0c;需要优化 解决方式&#xff1a; &#xff08;1&am…...

要理解网络,其实不就是理解这三张表吗

我们如果要理解数据是如果在网络世界中穿梭的&#xff0c;那其实只要了解其中的三张表就可以了。这三张表分别为路由表、转发表、ARP 表。 假设我们用聊天工具聊天的时候&#xff0c;我在北京&#xff0c;你在广东&#xff0c;当我给你发送一条消息的时候。搭载这这条消息的数据…...

Java异常架构与异常关键字

Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制。 Java异常机制可以使程序中异常处理代码和正常业务代码分离&#xff0c;保证程序代码更加优雅&#xff0c;并提高程序健壮性。在有效使用异常的情况下&#xff0c;异常能清晰的回答what, where, why这3个问…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...