gin

golangWeb框架---github.com/gin-gonic/gin学习四(模型绑定、自定义校验、ShouldBindXXX、BindXXX)

倖福魔咒の 提交于 2020-07-24 02:06:53
文章目录 模型绑定、校验 绑定json(ShouldBindJSON) 绑定xml(ShouldBindXML)、form(ShouldBind) 自定义校验器(demo有问题) BindQuery\ShouldBindQuery(只限查询参数) BindJson(json)、Bind(查询参数、formdata) 模型绑定、校验 以下来自百度翻译: 若要将请求体绑定到类型,请使用模型绑定。我们目前支持JSON、XML和标准表单值的绑定(Foo= Bar和Bo.BAZ)。 GIN使用Go PooWorks/Valual.V8进行验证。在这里查看标签使用的完整文档。 注意,需要在所有要绑定的字段上设置相应的绑定标记。例如,当从JSON绑定时,设置JSON:“FieldNeX”。 类型——必须绑定 Methods-Bind, BindJSON, BindXML, BindQuery Behavior-These methods use MustBindWith under the hood。如果绑定错误,请求将被 c.AbortWithError(400, err).SetType(ErrorTypeBind) 中止,响应状态码将被设置成400,响应头 Content-Type 将被设置成 text/plain;charset=utf-8。如果你尝试在这之后设置相应状态码

gin路由总结

ⅰ亾dé卋堺 提交于 2020-05-09 10:09:05
一、gin的路由算法 注册路由预处理 我们在使用gin时通过下面的代码注册路由 普通注册 router.POST("/login", func(context *gin.Context) { context.String(http.StatusOK, "login") }) 使用中间件 router.Use(Logger()) 使用Group v1 := router.Group("v1"){ v1.GET("/product/detail", func(context *gin.Context) { context.String(http.StatusOK, "product") }) } 这些操作, 最终都会在反应到gin的路由树上 具体实现 比如 POST(“/login”) // routergroup.go:L72-77 func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes { absolutePath := group.calculateAbsolutePath(relativePath) // relativePath<---/login handlers = group.combineHandlers(handlers)

多阶段构建Golang程序Docker镜像

会有一股神秘感。 提交于 2020-05-07 13:28:43
Docker简介 Docker是基于Linux容器技术(LXC),使用Go语言实现的开源项目,诞生于2013年,遵循Apache2.0协议。Docker自开源后,受到广泛的关注和讨论。 Docker在开发和运维中的优势 更快的交付和部署 使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境,开发完后,测试和运维人员可以直接使用完全相同的环境来部署代码,实现了生产环境的无缝运行。 更高效的资源利用 Docker容器的运行不需要额外的虚拟化管理程序支持,它是内核级的虚拟化 ,可以实现更高的性能,同时对资源的额外需求很低。 更轻松的迁移和扩展 Docker容器几乎可以在任意的平台上运行,支持主流的操作系统发行版本。这种兼容性让用户可以在不同平台之间轻松地迁移应用。 更简单的更新管理 使用Dockerfile,只需要修改一点点配置,就可以替代以往大量的更新工作。并且所有的修改都以增量的方式被分布和更新,从而实现自动化且高效的容器管理。 首先需要知道以下几个概念 Docker镜像 Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制和创建和更新现有的镜像,用户可以直接从网上下载一个已经做好的应用镜像,并直接使用。 Docker容器

Go pprof性能调优

扶醉桌前 提交于 2020-05-03 19:43:46
Go性能调优 在计算机性能调试领域里,profiling 是指对应用程序的画像,画像就是应用程序使用 CPU 和内存的情况。 Go语言是一个对性能特别看重的语言,因此语言中自带了 profiling 的库,这篇文章就要讲解怎么在 golang 中做 profiling。 Go性能优化 Go语言项目中的性能优化主要有以下几个方面: CPU profile:报告程序的 CPU 使用情况,按照一定频率去采集应用程序在 CPU 和寄存器上面的数据 Memory Profile(Heap Profile):报告程序的内存使用情况 Block Profiling:报告 goroutines 不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈 Goroutine Profiling:报告 goroutines 的使用情况,有哪些 goroutine,它们的调用关系是怎样的 采集性能数据 Go语言内置了获取程序的运行数据的工具,包括以下两个标准库: runtime/pprof :采集工具型应用运行数据进行分析 net/http/pprof :采集服务型应用运行时数据进行分析 pprof开启后,每隔一段时间(10ms)就会收集下当前的堆栈信息,获取格格函数占用的CPU以及内存资源;最后通过对这些采样数据进行分析,形成一个性能分析报告。 注意,我们只应该在性能测试的时候才在代码中引入pprof。

Gorm 预加载及实现联表条件查询仿WhereHas

半腔热情 提交于 2020-05-02 02:28:52
文献参考 http://gorm.book.jasperxu.com/ 写Go代码也有快一个月了,最近在将laravel项目转Gin的过程中,遇到了不少因为语法特性而导致迁移问题,其中一个就是Gorm这块 With方法被 Preload ,Association 替代 在laravel中,我们可以通过with方法将关联模型的数据引入并合并到查询的数据结构中 常见的写法如 $builder = Dynamic :: query () -> with ([ 'user:id,nickname,avatar,gender' , 'detail:id,dynamic_id,media_url,cover_img_url,media_time_length' , //'stat:id,dynamic_id,share_number,like_number,comment_number', 'topic:id,topic_name,topic_type' ]) -> where ( function ( $query ) use ($topicList,$followList){ $query -> whereIn ( "topic_id" , $topicList) -> orWhereIn ( 'user_id' ,$followList); });

Gin框架配置静态文件static

只谈情不闲聊 提交于 2020-04-30 18:39:47
Gin框架必须配置完路径才能访问静态文件 // gindemo.go package main import ( " net/http " " github.com/gin-gonic/gin " ) func main() { // 创建一个默认的路由引擎 r := gin.Default() // 配置模板 r.LoadHTMLGlob( " templates/**/* " ) // 配置静态文件夹路径 第一个参数是api,第二个是文件夹路径 r.StaticFS( " /static " , http.Dir( " ./static " )) // GET:请求方式;/hello:请求的路径 // 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数 r.GET( " /posts/index " , func(c * gin.Context) { // c.JSON:返回JSON格式的数据 c.HTML(http.StatusOK, " posts/index.html " , gin.H{ " title " : " posts/index " , }) }) r.GET( " gets/login " , func(c * gin.Context) { c.HTML(http.StatusOK, " posts/login.html " , gin.H{

Gin+Gorm小项目

↘锁芯ラ 提交于 2020-04-29 17:52:48
目录 Gin+Gorm小项目 创建项目 引用静态文件 搭建架子 创建数据库 添加功能 查找功能 修改功能 删除功能 总代码 Gin+Gorm小项目 创建项目 E:\gostudent\gin\bubble>go mod tidy //增加缺失的包,移除没用的包 package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { r := gin.Default() //告诉gin框架去哪里找模板文件 r.LoadHTMLGlob("templates/*") r.GET("/", func(c *gin.Context) { c.HTML(http.StatusOK, "index.html", nil) }) r.Run(":9090") } 引用静态文件 搭建架子 package main import ( "github.com/gin-gonic/gin" "net/http" ) //Tode Model type Tode struct { ID int `json:"id"` Title string `json:"title"` Status bool `json:"status"` } func main() { //创建数据库 //sql: CREATE DATABASE

gin请求数据校验

白昼怎懂夜的黑 提交于 2020-04-29 12:34:15
前言 最近优化 gin+vue的前后端分离项目 代码时候,发现代码中对请求数据的校验比较繁琐,于是想办法简化它。最终我发现了 go-playground/validator 开源库很好用。 优化前代码 代码如下: 发现每个方法都这样校验数据,很繁琐。 优化代码 这里使用 go-playground/validator 开源库来简化请求校验。 1.安装 go-playground/validator # 使用 Go Modules go env -w GO111MODULE=on # 安装 go-playground/validator go get github.com/go-playground/validator/v10 注意:v10版本是使用Go Modules,运行 go get github.com/go-playground/validator/v10 前需要确保 GO111MODULE=on ,不然会报: cannot find package "github.com/go-playground/validator/v10" 2.实现 StructValidator 接口的两个方法 StructValidator 是需要实现的最基本的接口,作为验证引擎来确保请求的正确性。 type StructValidator interface { ValidateStruct

人生苦短,Let's Go目录

↘锁芯ラ 提交于 2020-04-28 21:47:25
目录 GO语言系列(一)- 初识go语言 GO语言系列(二)- 基本数据类型和操作符 Go语言系列(三)- 基础函数和流程控制 GO语言系列(四)- 内置函数、闭包与高级数据类型 GO语言系列(五)- 结构体和接口 Go语言系列(六)- 接口和反射 Go语言系列(七)- 读写操作 Go语言系列(八)- Goroute和Channel Go语言系列(九)- Socket编程和Redis Go语言系列(十)- http编程和mysql Go语言系列(十一)之依赖管理 Go语言系列(十二)之RabbitMQ消息队列 Go语言系列(十三)之gin框架 Go语言系列(十四)之GORM学习指南 ... 更新中 Go语言知识点补充 01. Go语言中new和make的区别 02.Go语言中各种数据格式转换 03.Golang学习 - regexp 包 04.Go语言命名规范 Go 项目实战 Go语言实战-爬取校花网图片 Go语言实战爬虫项目 来源: oschina 链接: https://my.oschina.net/u/4323481/blog/3586961

gin系列-中间件

橙三吉。 提交于 2020-04-23 03:51:56
Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等 定义中间件 Gin中的中间件必须是一个gin.HandlerFunc类型 入门案例 package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" ) func indexHandler(c *gin.Context) { fmt.Println("index in ...") c.JSON(http.StatusOK, gin.H{ "msg": "indx", }) } //定义一个中间件 func m1(c *gin.Context) { fmt.Println("m1 in ....") } func main() { r := gin.Default() //GET(relativePath string, handlers ...HandlerFunc) IRoutes r.GET("/index",m1,indexHandler) //r.GET("/index", func(c *gin.Context) { // c.JSON(http.StatusOK, gin.H{ // "msg": "indx", //