gin 框架初始教程

news2024/11/15 15:50:06

一 、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 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()
}

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 main

import (
    "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 main

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

type myForm struct {
    Colors []string `form:"colors[]"`
}

func formHandler(c *gin.Context) {
    var fakeForm myForm
    c.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 main

import (
    "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 PersonString
    err := 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 PersonJson
    errJson := 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 main

import "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 Person
        if 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/372402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE10-循环语句(for、while、do...while)

文章目录一、for循环1.格式2.执行流程二、while循环1.格式三、do...while循环1.格式四、循环控制(break、continue)1.break2.continue五、案例1.请输出下列的形状2.打印99乘法表一、for循环 1.格式 初始化语句只有在最开始的时候执行了一次如果第一次进行条件判断的时候结果为…

测试开发 | 视频编辑SDK测试

短视频编辑SDK测试有一段时间了&#xff0c;因此抽时间对编辑SDK的相关内容进行简要复盘。 功能说明 短视频编辑SDK支持gif&#xff0c;不同格式的图片&#xff0c;视频文件的拼接导入&#xff0c;编辑&#xff0c;添加特效&#xff0c;合成导出等功能。更具体的介绍可以参照…

Elasticsearch:如何轻松安全地对实时 Elasticsearch 索引重新索引你的数据

在很多的时候&#xff0c;由于一些需求&#xff0c;我们不得不修改索引的映射&#xff0c;也即 mapping&#xff0c;这个时候我们需要重新索引&#xff08;reindex&#xff09;来把之前的数据索引到新的索引中。槽糕的是&#xff0c;我们的这个索引还在不断地收集实时数据&…

Python3-数字

Python3 数字(Number) Python 数字数据类型用于存储数值。 数据类型是不允许改变的,这就意味着如果改变数字数据类型的值&#xff0c;将重新分配内存空间。 Python 支持三种不同的数值类型&#xff1a; 整型(int) - 通常被称为是整型或整数&#xff0c;是正或负整数&#x…

8.Spring Security 权限控制

1.简介入门JavaEE和SpringMVC &#xff1a;Spring Security就是通过11个Fliter进行组合管理小Demouser实体类user.type字段&#xff0c;0普通用户&#xff0c;1超级管理员&#xff0c;2版主补全get set tostringimplement UserDetails&#xff0c;重写以下方法// true: 账号未过…

_improve-2

-------------------- 左边定宽&#xff0c;右边自适应方案 float margin&#xff0c;float calc /* 方案1 */ .left {width: 120px;float: left; } .right {margin-left: 120px; } /* 方案2 */ .left {width: 120px;float: left; } .right {width: calc(100% - 120px);fl…

【深度学习】线性回归、逻辑回归、二分类,多分类等基础知识总结

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言1. 线性回归2、逻辑回归3. 单层神经元的缺陷&多层感知机softmax 多分类前言 入行深度学习快2年了,是时间好好总结下基础知识了.现在看可能很多结论和刚学的…

SystemVerilog-时序逻辑建模(5)多个时钟和时钟域交叉

数字硬件建模SystemVerilog-时序逻辑建模&#xff08;5&#xff09;多个时钟和时钟域交叉数字门级电路可分为两大类&#xff1a;组合逻辑和时序逻辑。锁存器是组合逻辑和时序逻辑的一个交叉点&#xff0c;在后面会作为单独的主题处理。组合逻辑描述了门级电路&#xff0c;其中逻…

办公室人员离岗识别检测系统 yolov7

办公室人员离岗识别检测系统根据yolov7网络模型深度学习技术&#xff0c;办公室人员离岗识别检测算法能够7*24小时全天候自动识别人员是否在岗位。YOLOv7 在 5 FPS 到 160 FPS 范围内&#xff0c;速度和精度都超过了所有已知的目标检测器&#xff0c;并在V100 上&#xff0c;30…

2023/2/26 Vue学习笔记 配置代理解决跨域[CORS ]的问题

利用vue的脚手架巧妙的解决ajax跨域的问题 1 我们首先利用springboot服务搭建 注意这里引出了跨域[CORS ]的问题: Access to XMLHttpRequest at http://localhost:5000/getUserInfo from origin http://localhost:8080 has been blocked by CORS policy: No Access-Control-A…

【Java】Spring Boot 2 集成 nacos

【Java】Spring Boot 2 集成 nacos 官方文档&#xff1a;https://nacos.io/zh-cn/docs/quick-start-spring-boot.html pom 本次Springboot版本 2.2.6.RELEASE&#xff0c;nacos-config 版本 0.2.7&#xff0c;nacos-discovery版本 0.2.7 parent <parent><groupId&…

带你深层了解c语言指针

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍c语言中有关指针更深层的知识. 金句分享: ✨今天…

麻省理工学院,Web3 人才辈出

2 月 22 日&#xff0c;NFT 交易平台 Blur 创始人公开身份&#xff0c;曾就读于麻省理工学院计算机系。除了 NFT 交易平台&#xff0c;在公链、交易所、VC、媒体、Layer2 等 Web3 和 Crypto 的多个赛道&#xff0c;麻省理工学院&#xff08;MIT&#xff09;的毕业生和教授们均有…

HDMI协议介绍(二)--DataIsland Packets

前言 前文简单介绍了HDMI传输的三个周期&#xff1a;控制周期、DataIsland周期和Video周期。DataIsland传输音频和辅助数据&#xff0c;这些数据以Packet的形式传输。本文简单介绍DataIsland Packet。 目录 前言 数据岛概述 数据岛包的构造 Packet Header Paket Body Dat…

从0开始学python -40

Python3 面向对象-3 类属性与方法 类的私有属性 __private_attrs &#xff1a;两个下划线开头&#xff0c;声明该属性为私有&#xff0c;不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs 。 类的方法 在类的内部&#xff0c;使用 def 关键字…

Linux驱动——设备模型

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

蓝桥杯2015年第六届真题-奇怪的数列C++

题目&#xff1a;从X星截获一份电码&#xff0c;是一些数字&#xff0c;如下&#xff1a;13111331131321131113122113....YY博士经彻夜研究&#xff0c;发现了规律&#xff1a;第一行的数字随便是什么&#xff0c;以后每一行都是对上一行“读出来”比如第2行&#xff0c;是对第…

hadoop网站流量日志数据统计

系统背景介绍 数据提供企业决策能力 网站日志的数据分析------》受欢迎程度如何评价你这个网站的受欢迎程度 用数据 下载的人多了 观看的人多了 通过Hadoop 对某个网站产生的日志数据流量进行统计分析 得出该网站的访问流量 继而做出决策我们可以采用flume收集nginx的success文…

AcWing算法提高课-2.1.1池塘计数

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 题目传送门点这里 题目描述 农夫约翰有一片 N∗M 的矩形土地。 最近&#xff0c;由于降雨的原因&#xff0c;部分土地被水淹没了。 现在用一个字符矩阵来表示他的土地。 每个单元格内&…

EasyRecovery16最新免费版电脑数据恢复软件功能介绍

EasyRecovery是一款支持Windows/Mac平台进行恢复图片的专业工具&#xff0c;尤其是各种流行单反相机RAW格式文件&#xff0c;以及超大型视频文件等&#xff0c;推荐摄影爱好者使用。适用于主流相机、无人机、PC、存储卡、USB 闪存驱动器等&#xff0c;由于删除、损坏或意外格式…