gin框架学习笔记

智能车新手必看:如何用PID和差速转弯让小车跑得更稳(附代码示例) 本文详细介绍了智能车控制系统中PID算法和差速转弯的实现方法,包括位置式与增量式PID的选择、参数整定技巧以及编码器反馈的关键作用。通过代码示例和实战经验,帮助新手快速掌握智能车稳定行驶的核心技术,提升赛道表现。 阅读详情

gin框架学习笔记

官网review

  1. gin 是用go编写的web框架,由于httprputer(基于radix树路由)速度快了40倍,支持中间件,路由组处理,json等多方式验证,内置了json/xml/html等渲染,是一个易于使用的go 框架
  2. 如果是用常量,比如http.statusOk impport “net/http”
  3. gin使用默认的encoding/json作为默认的json包,但是可以通过其他标签构建改变他 (jsoniter: https://github.com/json-iterator/go)
    Replace(性能更棒)
import "encoding/json"
json.Marshal(&data)

with

import jsoniter "github.com/json-iterator/go"

var json = jsoniter.ConfigCompatibleWithStandardLibrary
json.Marshal(&data)

Replace

import "encoding/json"
json.Unmarshal(input, &data)

with

import jsoniter "github.com/json-iterator/go"

var json = jsoniter.ConfigCompatibleWithStandardLibrary
json.Unmarshal(input, &data)

4.gin默认开启msgPack渲染功能,关闭这个功能通过建立指定nomsgpack标签

 go build -tags=nomsgpack .

5.参数

 // path
 name := c.Param("name")
// query
firstname := c.DefaultQuery("firstname", "Guest")
lastname := c.Query("lastname")
// body
// Content-Type: application/x-www-form-urlencoded
message := c.PostForm("message")

6.中间件

// 默认创建一个没有任何中间件的路由器
	r  :=  gin . New ()
	r.Use(gin.Logger())
  1. 模型绑定和验证
    将请求body绑定请求类型,支持绑定,json,xml,yaml和
    Gin 使用go-playground/validator/v10进行验证(https://github.com/go-playground/validator)
    __NOTE: __ 需要绑定相应的标签在所有的字段上,如果想要绑定的话
    gin tingeing2种设置方式去绑定(一定要绑定和应该要绑定)
  2. 一定要绑定
    方法:Bind, BindJSON, BindXML, BindQuery, BindYAML, BindHeader
    行为: 如没有绑定将导致请求中指,并且使用c.AbortWithError(400, err).SetType(ErrorTypeBind)
  3. 应该要绑定
    方法: ShouldBind, ShouldBindJSON, ShouldBindXML, ShouldBindQuery, ShouldBindYAML, ShouldBindHeader
    行为:这些方法ShouldBindWith在后台使用。如果存在绑定错误,则返回错误,开发人员有责任适当地处理请求和错误。
// 默认创建一个没有任何中间件的路由器
type Login struct {
	User     string `form:"user" json:"user" xml:"user"  binding:"required"`
	Password string `form:"password" json:"password" xml:"password" binding:"required"`
}

func main() {
	router := gin.Default()

	// Example for binding JSON ({"user": "manu", "password": "123"})
	router.POST("/loginJSON", func(c *gin.Context) {
		var json Login
		if err := c.ShouldBindJSON(&json); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}

		if json.User != "manu" || json.Password != "123" {
			c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"})
			return
		}

		c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
	})
	
	// Listen and serve on 0.0.0.0:8080
	router.Run(":8080")
}

绑定query和body

type Person struct {
	Name    string `form:"name" json:"name"`
	Address string `form:"address" json:"address"`
}

func main() {
	route := gin.Default()
	route.GET("/testing", startPage)
	route.Run(":8085")
}

func startPage(c *gin.Context) {
	var person Person
	if c.Bind(&person) == nil {
		log.Println("====== Bind By Query String ======")
		log.Println(person.Name)
		log.Println(person.Address)
	}

	if c.BindJSON(&person) == nil {
		log.Println("====== Bind By JSON ======")
		log.Println(person.Name)
		log.Println(person.Address)
	}

	c.String(200, "Success")
}

8.重定向
内部和外部发送请求都是简单的,内部和外部都是支持的
会有坑需要注意(https://github.com/gin-gonic/gin/issues/444)

// 外部
r.GET("/test", func(c *gin.Context) {
	c.Redirect(http.StatusMovedPermanently, "http://www.google.com/")
})
// 内部
r.POST("/test", func(c *gin.Context) {
	c.Redirect(http.StatusFound, "/foo")
})

9.中间件

  1. 简单中间件(默认gin.Default()/自定义gin.New())
// 自定义中间件
func Logger() gin.HandlerFunc {
	return func(c *gin.Context) {
		t := time.Now()

		// Set example variable
		c.Set("example", "12345")

		// before request

		c.Next()

		// after request
		latency := time.Since(t)
		log.Print(latency)

		// access the status we are sending
		status := c.Writer.Status()
		log.Println(status)
	}
}

func main() {
	r := gin.New()
	r.Use(Logger())

	r.GET("/test", func(c *gin.Context) {
		example := c.MustGet("example").(string)

		// it would print: "12345"
		log.Println(example)
	})

	// Listen and serve on 0.0.0.0:8080
	r.Run(":8080")
}
// 默认中间件
func main() {
	r := gin.Default()

	// Listen and serve on 0.0.0.0:8080
	r.Run(":8080")
}

10.Goroutines中间件
当内部使用一个新的在中间件Goroutines处理程序时,您不应该使用其中的原始上下文,您必须使用只读副本。

func main() {
	r := gin.Default()

	r.GET("/long_async", func(c *gin.Context) {
		// create copy to be used inside the goroutine
		cCp := c.Copy()
		go func() {
			// simulate a long task with time.Sleep(). 5 seconds
			time.Sleep(5 * time.Second)

			// note that you are using the copied context "cCp", IMPORTANT
			log.Println("Done! in path " + cCp.Request.URL.Path)
		}()
	})

	r.GET("/long_sync", func(c *gin.Context) {
		// simulate a long task with time.Sleep(). 5 seconds
		time.Sleep(5 * time.Second)

		// since we are NOT using a goroutine, we do not have to copy the context
		log.Println("Done! in path " + c.Request.URL.Path)
	})

	// Listen and serve on 0.0.0.0:8080
	r.Run(":8080")
}

11.自定义 HTTP 配置

func main() {
	router := gin.Default()
	http.ListenAndServe(":8080", router)
}
or

func main() {
	router := gin.Default()

	s := &http.Server{
		Addr:           ":8080",
		Handler:        router,
		ReadTimeout:    10 * time.Second,
		WriteTimeout:   10 * time.Second,
		MaxHeaderBytes: 1 << 20,
	}
	s.ListenAndServe()
}

12.使用 Gin 运行多项服务

package main

import (
	"log"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
	"golang.org/x/sync/errgroup"
)

var (
	g errgroup.Group
)

func router01() http.Handler {
	e := gin.New()
	e.Use(gin.Recovery())
	e.GET("/", func(c *gin.Context) {
		c.JSON(
			http.StatusOK,
			gin.H{
				"code":  http.StatusOK,
				"error": "Welcome server 01",
			},
		)
	})

	return e
}

func router02() http.Handler {
	e := gin.New()
	e.Use(gin.Recovery())
	e.GET("/", func(c *gin.Context) {
		c.JSON(
			http.StatusOK,
			gin.H{
				"code":  http.StatusOK,
				"error": "Welcome server 02",
			},
		)
	})

	return e
}

func main() {
	server01 := &http.Server{
		Addr:         ":8080",
		Handler:      router01(),
		ReadTimeout:  5 * time.Second,
		WriteTimeout: 10 * time.Second,
	}

	server02 := &http.Server{
		Addr:         ":8081",
		Handler:      router02(),
		ReadTimeout:  5 * time.Second,
		WriteTimeout: 10 * time.Second,
	}

	g.Go(func() error {
		err := server01.ListenAndServe()
		if err != nil && err != http.ErrServerClosed {
			log.Fatal(err)
		}
		return err
	})

	g.Go(func() error {
		err := server02.ListenAndServe()
		if err != nil && err != http.ErrServerClosed {
			log.Fatal(err)
		}
		return err
	})

	if err := g.Wait(); err != nil {
		log.Fatal(err)
	}
}

12.定义路由日志格式
路由的默认日志是:

[GIN-debug] POST   /foo                      --> main.main.func1 (3 handlers)
[GIN-debug] GET    /bar                      --> main.main.func2 (3 handlers)
[GIN-debug] GET    /status                   --> main.main.func3 (3 handlers)

修改日志格式使用,gin.DebugPrintRouteFunc函数

import (
	"log"
	"net/http"

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

func main() {
	r := gin.Default()
	gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) {
		log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers)
	}

	r.POST("/foo", func(c *gin.Context) {
		c.JSON(http.StatusOK, "foo")
	})

	r.GET("/bar", func(c *gin.Context) {
		c.JSON(http.StatusOK, "bar")
	})

	r.GET("/status", func(c *gin.Context) {
		c.JSON(http.StatusOK, "ok")
	})

	// Listen and Server in http://0.0.0.0:8080
	r.Run()
}

设置获取cookie

import (
    "fmt"

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

func main() {

    router := gin.Default()

    router.GET("/cookie", func(c *gin.Context) {

        cookie, err := c.Cookie("gin_cookie")

        if err != nil {
            cookie = "NotSet"
            c.SetCookie("gin_cookie", "test", 3600, "/", "localhost", false, true)
        }

        fmt.Printf("Cookie value: %s \n", cookie)
    })

    router.Run()
}
YOLO26改进策略【Neck】| CVPR2025 LCA轻量交叉注意力 跨层级双向引导 + 分层降噪增强,提升微小目标特征表达 简单相加、拼接融合无法建立深浅层双向约束关系,浅层微小目标易被深层背景覆盖,深层全局信息难以修正浅层噪声;普通单路自注意力仅单一层内建模依赖,缺少跨层级特征互引导机制,深浅特征信息割裂;标准多头跨注意力计算量大、参数量高,轻量化单模态检测/分割网络部署困难,无法区分前景目标与背景噪声。为此设计单模态轻量化交叉注意力LCA,构建浅层细节、深层语义双分支双向引导结构,轻量完成跨层级特征交互,同步降噪并强化单模态微小目标特征。 阅读详情

相关推荐

遥感新手别纠结!实测ENVI 5.3、5.6、6.0三个免费版,教你混搭安装避坑

本文为遥感新手提供ENVI 5.3、5.6、6.0三个免费版的实测对比与混搭安装指南,帮助用户构建零成本高效工作流。详细解析各版本功能差异、共存安装技巧及常见问题解决方案,特别适合课程作业、毕业论文分析和遥感入门练习。

weixin_30819085的博客 477

Gin使用

1. 获取post请求数据 tag标记为form时,json和form请求字段均小写 tag标记为json时,json请求小写,form请求首字母大写 1. 获取post请求form表单提交的数据 type user struct { Username string `form:"username"` Password string `form:"password"` } func main() { r := gin.Default() r.POST("hello", func(c *gin.Co

weixin_42248522的博客 752

opencv去除印章痕迹

今天看到一个很有意思的程序,就是去除票据上的红色印章,觉得很有意思,就把它抄过来记录一下,同时自己也开了一下脑洞。 原来的程序来自:https://www.cnblogs.com/skyfsm/p/7638301.html 可以看到图像效果很不错,下面是源码实现: #include &lt;iostream&gt; #include &lt;opencv2/imgproc/imgpro...

zeng_haoyu的博客 7961

Gin各种参数接收

在传输或接受JSON数据时,通常习惯通过创建结构体的方式存储数据。结论: 方法的用法和querystring的基本一致。说明: Gin框架中不是每个数据格式都有对应的。方法和querystring用法基本一致。优点: 相比前面的更加快捷高效。

JUIU9527的博客 1499

【驭风计划 机器学习】实验6 基于集成学习的 Amazon 用户评论质量预测

¶随着电商平台的兴起,以及疫情的持续影响,线上购物在我们的日常生活中扮演着越来越重要的角色。在进行线上商品挑选时,评论往往是我们十分关注的一个方面。然而目前电商网站的评论质量参差不齐,甚至有水军刷好评或者恶意差评的情况出现,严重影响了顾客的购物体验。因此,对于评论质量的预测成为电商平台越来越关注的话题,如果能自动对评论质量进行评估,就能根据预测结果避免展现低质量的评论。本案例中我们将基于集成学习的方法对 Amazon 现实场景中的评论质量进行预测。

Mege1的博客 473

手把手教你学simulink(31.17)--双向DCDC电源场景示例:基于simulink 的双向DCDC应用:车载充电器的pi控制

通过引入PI控制器,系统可以更精确地控制电压和电流,确保充电和放电过程的稳定性和高效性。

MHD0815的博客 206

Go Gin 系列三:开发标签模块

涉及知识点Gin:Golang 的一个微框架,性能极佳。beego-validation:本节采用的 beego 的表单验证库,中文文档。gorm,对开发人员友好的 ORM 框架,英文文...

EDDYCJY的博客 716

Transformer模型详解

​本文主要介绍Transformer系列,从基础到理论,对注意力机制进行总结并解释《Attention is all you need》,提出解决sequence to sequence问题的transformer模型,用全attention的结构代替了lstm,抛弃了之前传统的encoder-decoder模型必须结合cnn或者rnn的固有模式,只用attention。文章的主要目的是在减少计算量和提高并行效率的同时不损害最终的实验结果。

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 5311

GIN框架:自定义结构体到出JSON格式

gin框架自定义结构体体导出为空问题

qq_45083002的博客 660

【AI智能体】飞书 AI 智能客服机器人搭建与使用实战操作详解

飞书 AI 智能客服机器人搭建与使用实战操作详解

congge 6059

SST专题(2-5)MMC-SST 输入级的环流抑制

本文研究了模块化多电平换流器(MMC)的数学模型及其环流抑制控制方法。首先建立了MMC等效电路模型,推导了桥臂电流方程和虚拟电动势表达式,提出通过控制桥臂电压修正量来调节内部电流而不影响外部特性。针对MMC特有的二倍频负序环流问题,设计了基于负序旋转坐标变换的环流抑制控制器(CCSC),将时变环流转换为直流量进行控制。通过比例-积分调节和电压前馈补偿,生成内部不平衡压降参考值,最终形成包含功率控制和环流抑制的整体控制结构。仿真结果表明该方法能有效抑制内部环流,同时保持系统稳定运行。

嵌入式老牛的博客 538

Gin 笔记(08)— 渲染 XML、JSON、YAML、ProtoBuf、上传单个文件、上传多个文件、替换 JSON 编译、无 MsgPack 渲染功能编译

渲染 XML、JSON、YAML、ProtoBuf、上传单个文件、上传多个文件、替换 JSON 编译、

wohu1104的专栏 670

自适应控制 (Adaptive Control) 算法详解及案例分析

自适应控制是一种能够在线调整控制器参数以适应系统动态变化的控制方法。其核心思想是通过实时估计系统参数或调整控制器参数,使系统在不确定性或动态变化的环境中仍能保持稳定性和性能。

闲人编程的博客 4085

TMDOG的Gin学习笔记_01——初识Gin框架

通过本篇学习笔记,我们初步了解了gin的基本用法,包括如何安装、创建简单的Web应用以及整合gorm进行数据库操作。我们实现了一个用户管理的RESTful API,能够完成基本的增删改查功能。我们发现gin是一个非常简洁的一个框架,几行代码就可以构建一个Web应用,和express.js有着异曲同工之妙。接下来我会继续分享我的学习笔记,尽请期待。

m0_74139496的博客 899

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Go Gin 框架学习笔记

Go Gin 框架学习笔记 Gin 描述 轻量级 http web 框架,允许速度非常快 最擅长的是 Api 接口的高并发 入门 创建默认的路由引擎 r = gin.Default() 启动 http 服务,默认在 8080 端口 r.Run(":8000") 返回字符串 c.String(200, "我是新闻页面") c.String(200, "值: %v", "你好gin") gin 支持 RestFul r.PUT() r.GET() r.POST() r.DELETE()

weixin_49457619的博客 1017

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Gin框架学习笔记

GIN框架学习 前言 这是一场试炼,战胜了过去的自己才能见到更好的未来! DAY 1 今天用了一整天时间来学习go语言的语法。大致做了以下内容。 搭建GO语言环境 用vscode写代码时,需要打开一个工程文件夹,其中只能包含一个main.go文件和一个package main。当需要引入第三方的包时,需要在当前目录下用go mod init <工程名字> 来创建一个go.mod文件来存储第三方下载的包的依赖关系,然后再main.go中写代码即可。 写一个最简单go语言程序 = 表示赋值 := 表

qwqgood的博客 1429

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

0x0 Gin简介1.Gin 是什么?Gin 是一个用 Go (Golang) 编写的 HTTP web 框架。 它是一个类似于martini但拥有更好性能的 API 框架, 由于httprouter,速度提高了近 40 倍。如果你需要极好的性能,使用 Gin 吧。2.Gin相关地址0x1快速开始1. 用module模式创建工程mkdirweb_apicdweb_apigo mod in...

weixin_39589253的博客 885

Gin框架学习笔记(六)——gin中的日志使用

fmt.Printf("[三玖]: %v %v %v %v \n",[三玖]: GET / main.main.func1 3至此我们对Gin框架的简单学习就到此为止了,更多的学习大家可以前去查看Gin框架官方文档Gin框架官方文档后面就要开始对Gorm的学习了,下篇见!

qq_73924465的博客 3532

Golang学习笔记--Gin框架

Gin是 Golang 世界里最流行的 web 框架,在 github上进行开源。支持中间件操作( handlersChain 机制 )更方便的使用( gin.Context )更强大的路由解析能力( radix tree 路由树 )gin 将 Engine 作为 http.Handler 的实现类进行注入,从而融入 Golang net/http 标准库的框架之内gin 中基于 handler 链的方式实现中间件和处理函数的协调使用。

HideonHacker的博客 2219

我的go学习笔记之gin框架

gin框架学习

qq_45184330的博客 305

gin框架源码学习笔记(一)简单解读一个hello程序

gin框架源码学习笔记(一)简单解读一个hello程序 文章目录gin框架源码学习笔记(一)简单解读一个hello程序hello程序Default()EngineGET()run()小结 先把源码拉下来,go get github.com/gin-gonic/gin 之后本章简单解读一个hello程序. hello程序 package main import ( "github.co...

靑い空゛ 920

Go gin框架学习笔记

在golang命令行执行 go get -u github.com/gin-gonic/gin使用方式如下:首先gin.Default创建引擎然后业务逻辑 engine.GET(“/url”,func(){})启动服务端 engine.Run(“ip:端口”)

tigeraowu的博客 664
上一篇: 10分钟掌握sentry
蛮吉(lambda)
博客等级 码龄7年 2粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值