Go语言中文网 为您找到相关结果 636

Go 使用 defer 函数 要注意的几个点

概述 defer 函数大家肯定都用过,它在声明时不会立刻去执行,而是在函数 return 后去执行的。 它的主要应用场景有异常处理、记录日志、清理数据、释放资源 等等。 这篇文章不是分享 defer 的应用场景,而是分享使用 defer 需要注意的点。 咱们先从一道题开始,一起来感受下 ... func calc(index string, a, b int) int { ret := a + b fmt.Println(index, a, b, ret) return ret } func main() { x := 1 y := 2 defer calc("A", x, calc("B", x, y)) x = 3 defer calc("C", x, calc("D", x, y)) ...阅读全文

博文 2019-12-22 10:34:20 訢亮

Gin源码解析和例子——路由

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/breaksoftware/article/details/84667656 Gin是一个基于golang的net包实现的网络框架。从github上,我们可以看到它相对于其他框架而言,具有优越的性能。本系列将从应用的角度来解析其源码。(转载请指明出于breaksoftware的csdn博客) 本文我们将分析其路由的原理。先看个例子(源于github) func main() { // Disable Console Color // gin.DisableConsoleColor() // Creates a gin router with default middleware: // logg...阅读全文

博文 2019-01-09 19:14:44 breaksoftware

04Gin源码解读

简介 内置中间件的实现 recovery auth logger errors 总结 简介 Gin 源码解读, 基于 v1.5.0 版本. 内置中间件的实现 前面已经研究过中间件的原理了, 这次来看一下内置的中间件是如何实现的. recovery // Recovery returns a middleware that recovers from any panics and writes a 500 if there was one. func Recovery() HandlerFunc { return RecoveryWithWriter(DefaultErrorWriter) } recovery 中间件用于从 panic 中恢复, 并返回 500 响应. 在看代码之前, 首先介...阅读全文

博文 2019-12-15 17:32:40 刷漆猫咪

GO语言web框架Gin之完全指南(二)

这篇主要讲解自定义日志与数据验证 参数验证 我们知道,一个请求完全依赖前端的参数验证是不够的,需要前后端一起配合,才能万无一失,下面介绍一下,在Gin框架里面,怎么做接口参数验证的呢 gin 目前是使用 go-playground/validator 这个框架,截止目前,默认是使用 v10 版本;具体用法可以看看 validator package · go.dev 文档说明哦 下面以一个单元测试,简单说明下如何在tag里验证前端传递过来的数据 简单的例子 func TestValidation(t *testing.T) { ctx, _ := gin.CreateTestContext(httptest.NewRecorder()) testCase := []struct { msg ...阅读全文

博文 2020-03-23 17:32:47 Paul

基于 Go + MySQL + ES 实现一个 Tag API 服务

Tag 是一个很常见的功能,这篇文章将使用 Go + MySQL + ES 实现一个 500 多行的 tag API 服务,支持 创建/搜索 标签、标签关联到实体 和 查询实体所关联的标签列表。 初始化环境 MySQL brew install mysql 复制代码ES 这里直接通过 docker 来启动 ES: docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch 复制代码启动后可以通过 curl 检查是否已经启动和获取版本信息: curl localhost:9200 { "name" : "5059f2c85a1d", "clu...阅读全文

博文 2020-06-05 19:34:19 3vilive

golang reflect笔记

最近有大量用到reflect,给一流开源项目gin贡献的pr就是这方面的技巧,也在自己的开源项目中使用了大量使用reflect简化接口开发。鉴于reflect的接口特别难用,特别容易忘记,记录下。 判断类型 // 提取类型信息到变量里 var stringSliceType = reflect.TypeOf([]string{}) var intSliceType = reflect.TypeOf([]int{}) var int32SliceType = reflect.TypeOf([]int32{}) func typeCheck(x interface{}) { // 提取interface{}里面的类型信息 vt := reflect.ValueOf(x).Type() switc...阅读全文

博文 2019-05-31 15:34:52 疯狂一只小蚂蚁

01Gin源码解读

简介 Gin 源码解读, 基于 v1.5.0 版本. 流程总览 官方文档上, 一个入门例子如下: 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() // 监听并在 0.0.0.0:8080 上启动服务 } 看上去非常简单, 首先进行初始化 gin.Default(), 接着定义了一个叫做 /ping 的路由, 最后直接启动了 r.Run(). 初始化 首先, 深入查看下 gin.Default() 的过程:...阅读全文

Go 包依赖管理工具 —— govendor

govendor 是一个基于 vendor 机制实现的 Go 包依赖管理命令行工具。与原生 vendor 无侵入性融合,也支持从其他依赖管理工具迁移,可以很方便的实现同一个包在不同项目中不同版本、以及无相互侵入的开发和管理。 vendor 特性 最开始的时候,Go 并没有提供较为妥当的包管理工具。从 1.5 版本开始提供了 vendor 特性,但需要手动设置环境变量 GO15VENDOREXPERIMENT=1。 在执行 go build 或 go run 命令时,会按照以下顺序去查找包: 当前包下的 vendor 目录 向上级目录查找,直到找到 src 下的 vendor 目录 在 GOROOT 目录下查找 在 GOPATH 下面查找依赖包 在发布 1.6 版本时,该环境变量的值已经默认设...阅读全文

博文 2019-03-25 18:34:39 Jioby

Go的包管理 - go modules

一、go modules使用 前言 Go的依赖包管理是被大家诟病最多的一个地方,先后出现了glide、godep、dep等包管理工具,但是Go的包管理一直没有一个统一的方法,不同的项目可能会使用不同的管理工具。go modules是go 1.11之后推出的一种新的包管理工具,解决了之前的包管理中存在的一些问题。 项目不必放在GOPATH/src下 可以自动下载依赖包 版本控制功能 go modules介绍 Go 1.11和1.12包含了对modules的初步支持。modules是Go的新的依赖管理系统,能够使依赖项的版本信息更加清晰并且更加容易管理。这篇文章介绍了使用modules的基本操作。 module是Go的包的集合,以文件树的形式存储在顶层目录的go.mod文件中。go.mod文件定...阅读全文

博文 2019-09-29 14:02:38 朝阳区群众

Build RESTful API service using Gin Web Framework

安装依赖 $ go get -u github.com/gin-gonic/gin $ go get -u github.com/jinzhu/gorm $ go get github.com/go-sql-driver/mysql 路由规划 POST todos/ GET todos/ GET todos/{id} PUT todos/{id} DELETE todos/{id} 完整源码 package main import ( "github.com/gin-gonic/gin" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" "net/http" "strconv" ) type ( Todo s...阅读全文

博文 2018-10-06 19:34:39 与蟒唯舞

goa - 基于中间件的轻量级golang web框架

### Goa [Goa](https://goa-go.github.io)是一个基于中间件的golang web框架,其整体思想来源于[koajs](https://github.com/koajs/koa),并且结合了golang的特性。Goa致力于成为 web 应用和 API 开发领域中的一个更轻量、更高效的框架。Goa 并没有捆绑任何中间件,而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。 > Goa采用了许多[koajs](https://github.com/koajs/koa)的特性,部分API参照了[gin](https://github.com/gin-gonic/gin)源码。 > goa-router则是完全基于高效、内存占用低的[httprouter...阅读全文

博文 2019-09-18 19:40:53 NicholasCao

Go语言(十三)Gin Web框架

Gin Web框架 简介 基于httprouter开发的web框架:https://github.com/gin-gonic/gin 提供Martini风格的API,但比Martini要快40倍 非常轻量级,使用简洁 Gin框架的安装与使用 安装: go get -u github.com/gin-gonic/gin 基本使用 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("0.0.0.0:9090") } 支持restful风格的...阅读全文

博文 2020-04-19 10:33:13 wx5b285b48ed74e

03Gin源码解读

简介 Context 初始化 Context 之请求参数获取 Context 之模型绑定和验证 Context 之响应 Context 之高级响应 Context 之内容协商 总结 简介 Gin 源码解读, 基于 v1.5.0 版本. Context 初始化 Context 是 Gin 中很重要的一个部分, 先看一下注释是怎么说的. // Context is the most important part of gin. It allows us to pass variables between middleware, // manage the flow, validate the JSON of a request and render a JSON response for exa...阅读全文

博文 2019-12-08 10:32:39 帅气猫咪

gin是怎么处理请求的,源码分析

一.github上gin的 quick start 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() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") } gin建立web服务的步骤: 1). 通过调用 gin.Default() 得到一个 *gin.Engine 2). 添加设置路由以及处理请求 3). 监听 8080端口...阅读全文

博文 2020-05-09 19:32:42 Bomb_

Go - 使用 defer 函数 要注意的几个点

概述 defer 函数大家肯定都用过,它在声明时不会立刻去执行,而是在函数 return 后去执行的。 它的主要应用场景有异常处理、记录日志、清理数据、释放资源 等等。 这篇文章不是分享 defer 的应用场景,而是分享使用 defer 需要注意的点。 咱们先从一道题开始,一起来感受下 ... func calc(index string, a, b int) int { ret := a + b fmt.Println(index, a, b, ret) return ret } func main() { x := 1 y := 2 defer calc("A", x, calc("B", x, y)) x = 3 defer calc("C", x, calc("D", x, y)) ...阅读全文

博文 2019-12-22 12:32:39 新亮

使用 Go 读写请求

简介 读取请求参数 path 中的参数 query 中的参数 from 中的参数 模型绑定 返回响应 总结 当前部分的代码 简介 使用 web 框架, 最基础的事情就是读写请求了, Gin 支持很多种类的请求参数, 也支持多种格式的响应. 读取请求参数 path 中的参数 使用 Param() 可以获取 path 中的参数. 定义在 path 中的参数有两种格式, 一个是 :name 的以冒号开头的, 另一种是 *action 的以星号开头的. :name 是必定匹配的, 一定要有值, 不能为空. 下面的代码中, 第一个例子就是如此, 用 :name 来表示用户的名字, 这样就可以在路径中表示任意的用户名了. *action 是可选的, 如果不存在, 就会忽略掉, 比如是可以匹配到 /use...阅读全文

博文 2019-10-07 00:35:53 帅气猫咪

用go-module作为包管理器搭建go的web服务器

本篇博客主要介绍了如何从零开始,使用Go Module作为依赖管理,基于Gin来一步一步搭建Go的Web服务器。并使用Endless来使服务器平滑重启,使用Swagger来自动生成Api文档。 源码在此处:项目源码 大家可以先查看源码,然后再根据本篇文章,来了解搭建过程中服务器的一些细节。 搭建环境 以下所有的步骤都基于MacOS。 安装go 在这里推荐使用homebrew进行安装。当然你也可以使用源码安装。 brew install go 复制代码跑完命令之后,在命令行输入go。如果在命令行看到如下输出,则代表安装成功。 Go is a tool for managing Go source code. Usage: go [arguments] The command...阅读全文

博文 2019-06-10 21:04:40 detectiveHLH

gin 源码阅读(二)-- 路由和路由组

上次我们说到 [gin 的启动过程及实现](),今天来细讲 gin 的路由。 用法 还是老样子,先从使用方式开始: func main() { r := gin.Default() r.GET("/hello", func(context *gin.Context) { fmt.Fprint(context.Writer, "hello world") }) r.POST("/somePost", func(context *gin.Context) { context.String(http.StatusOK, "some post") }) r.Run() // 监听并在 0.0.0.0:8080 上启动服务 } 平时开发中,用得比较多的就是 Get 和 Post 的方法,上面简单的写了...阅读全文

博文 2020-04-25 19:32:40 若鱼治水

[系列] - go-gin-api 路由中间件 - 签名验证(七)

概览 首先同步下项目概况: 上篇文章分享了,路由中间件 - Jaeger 链路追踪(实战篇),文章反响真是出乎意料, 「Go中国」 公众号也转发了,有很多朋友加我好友交流,直呼我大神,其实我哪是什么大神,只不过在本地实践了而已,对于 Go 语言的使用,我还是个新人,在这里感谢大家的厚爱! 这篇文章咱们分享:路由中间件 - 签名验证。 为什么使用签名验证? 这个就不用多说了吧,主要是为了保证接口安全和识别调用方身份,基于这两点,咱们一起设计下签名。 调用方需要申请 App Key 和 App Secret,App Key 用来识别调用方身份,App Secret 用来加密生成签名使用。 当然生成的签名还需要满足以下几点: 可变性:每次的签名必须是不一样的。 时效性:每次请求的时效性,过期作废。...阅读全文

博文 2019-10-26 22:34:28 訢亮

Gin框架系列03:换个姿势理解中间件

什么是中间件 中间件,英译middleware,顾名思义,放在中间的物件,那么放在谁中间呢?本来,客户端可以直接请求到服务端接口。 现在,中间件横插一脚,它能在请求到达接口之前拦截请求,做一些特殊处理,比如日志记录,故障处理等。这就是今天要讲述的中间件,那么,它在Gin框架中是怎么使用的呢? 如何使用中间件 我们来看一下逢gin必调的方法Default,方法中有一个变量engine,它Use了Logger和Recovery两个函数,这两个函数就是gin框架的日志和故障处理中间件。 func Default() *Engine { debugPrintWARNINGDefault() engine := New() engine.Use(Logger(), Recovery()) return...阅读全文

博文 2020-04-09 16:36:08 平也

[系列] - go-gin-api 规划目录和参数验证(二)

概述 首先同步下项目概况: 上篇文章分享了,使用 go modules 初始化项目,这篇文章咱们分享: 规划目录结构 模型绑定和验证 自定义验证器 制定 API 返回结构 废话不多说,咱们开始吧。 规划目录结构 ├─ go-gin-api │ ├─ app │ ├─ config //配置文件 │ ├─ config.go │ ├─ controller //控制器层 │ ├─ param_bind │ ├─ param_verify │ ├─ ... │ ├─ model //数据库ORM │ ├─ proto │ ├─ ... │ ├─ repository //数据库操作层 │ ├─ ... │ ├─ route //路由 │ ├─ middleware │ ├─ route.go │...阅读全文

博文 2019-08-28 13:02:37 新亮

Gin Web Framework in Go (Golang)

Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance -- up to 40 times faster. 支撑点 Gin uses a custom version of HttpRouter. Low Overhead Powerful API HttpRouter: the fastest HTTP router for Golang. Httprouter was created by Julien Schmidt and it’s based in a Radix Tree algorithm. The martin...阅读全文

博文 2018-12-19 21:34:42 michael_jia

[系列] - 使用 go modules 包管理工具(一)

概述 我想实现一个开箱即用的 API 框架的轮子,这个轮子是基于 Gin 基础上开发的。 为什么是开箱即用,它会集成哪些功能? 以上功能点,都是常用的,后期可能还会增加。 废话不多说,咱们开始吧。 创建一个项目,咱们首先要考虑一个依赖包的管理工具。 常见的包管理有,dep、go vendor、glide、go modules 等。 最开始,使用过 dep,当时被朋友 diss 了,推荐我使用 go modules 。 现在来说一下 go modules ,这个是随着 Go 1.11 的发布和我们见面的,这是官方提倡的新的包管理。 说一个环境变量:GO111MODULE,默认值为 auto 。 当项目中有 go.mod 时,使用 go modules 管理,反之使用 旧的 GOPATH 和 v...阅读全文

博文 2019-08-26 19:32:46 新亮

Golang 使用 Prpme

???? ginpromPrometheus metrics exporter for Gin.Inspired by Depado/ginprom.???? Installation$ go get -u github.com/chenjiandongx/ginprom???? UsageIt's easy to get started with ginprom, only a few lines of code needed.import ( "github.com/chenjiandongx/ginprom" "github.com/gin-gonic/gin" "github.com/prometheus/client_golang/prometheus/promhttp" ) fu...阅读全文

博文 2019-08-20 10:22:50 chenjiandongx

[系列] - go-gin-api 路由中间件 - 签名验证(七)

概览 首先同步下项目概况: 上篇文章分享了,路由中间件 - Jaeger 链路追踪(实战篇),文章反响真是出乎意料, 「Go中国」 公众号也转发了,有很多朋友加我好友交流,直呼我大神,其实我哪是什么大神,只不过在本地实践了而已,对于 Go 语言的使用,我还是个新人,在这里感谢大家的厚爱! 这篇文章咱们分享:路由中间件 - 签名验证。 为什么使用签名验证? 这个就不用多说了吧,主要是为了保证接口安全和识别调用方身份,基于这两点,咱们一起设计下签名。 调用方需要申请 App Key 和 App Secret,App Key 用来识别调用方身份,App Secret 用来加密生成签名使用。 当然生成的签名还需要满足以下几点: 可变性:每次的签名必须是不一样的。 时效性:每次请求的时效性,过期作废。...阅读全文

博文 2019-10-26 18:02:39 新亮

Gin框架系列03:换个姿势理解中间件

什么是中间件 中间件,英译middleware,顾名思义,放在中间的物件,那么放在谁中间呢?本来,客户端可以直接请求到服务端接口。 现在,中间件横插一脚,它能在请求到达接口之前拦截请求,做一些特殊处理,比如日志记录,故障处理等。这就是今天要讲述的中间件,那么,它在Gin框架中是怎么使用的呢? 如何使用中间件 我们来看一下逢gin必调的方法Default,方法中有一个变量engine,它Use了Logger和Recovery两个函数,这两个函数就是gin框架的日志和故障处理中间件。 func Default() *Engine { debugPrintWARNINGDefault() engine := New() engine.Use(Logger(), Recovery()) return...阅读全文

博文 2020-04-09 16:34:22 平也

golang 文件上传

一、使用Postman中form-data方式: package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" "time" ) func upload360(c *gin.Context) { bit := c.PostForm("bit") fmt.Println(bit) file,err := c.FormFile("file") if err != nil { c.JSON(http.StatusBadRequest,gin.H{ "message":"a Bad request!", }) return } nowTime := string([]rune(time.Now().String())[0:10])...阅读全文

博文 2019-08-09 14:39:06 LLL_小浪

sync pool 源码分析

目的 Many Go programs and packages try to reuse memory either for locality reasons or to reduce GC pressure。 缓解GC压力 GC(garbage collector): 自动垃圾回收,减轻了程序员的压力 减轻压力的同时,也增加了运行时开销。 sync.pool应运而生,设计的目的是用来保存和复用临时对象,减小GC分配,降低GC压力。 Pool设计用意是在全局变量里维护的释放链表,尤其是被多个 goroutine 同时访问的全局变量。使用Pool代替自己写的释放链表,可以让程序运行的时候,在恰当的场景下从池里-重用-某项值。 sync.Pool的一种使用场景是,为临时缓冲区创建一个池,多个客...阅读全文

博文 2020-05-20 16:53:40 7赢月

「工具推荐」golang 代码可视化工具 go-callvis

「工具推荐」go-callvis go-callvis是相对 以图片的形式展示了go程序的调用关系,这个工具在看复杂项目时尤其有用。 亲测,借助它看祖传golang代码,头痛好多了。 安装 go get -u github.com/TrueFurby/go-callvis # or git clone https://github.com/TrueFurby/go-callvis.git cd go-callvis && make install 运行依赖 Go 1.12+ Graphviz:http://www.graphviz.org/download/ Mac 可以直接 brew install graphviz 项目地址:https://github.com/TrueFurby/go...阅读全文

博文 2020-01-19 23:32:43 goodspeed

Go 自定义日期时间格式解析解决方案 - 解决 `parsing time xx as xx: cannot parse xx as xx` 错误

最近在解析 Go 的日期数据格式时(mysql 的 datetime 类型)时遇到个问题,在网上搜了很多方案都试了以后发现不可行,于是自己尝试解决后将解决方案发布出来。 Go 自身的 time.Time 类型默认解析的日期格式是 RFC3339 标准,也就是 2006-01-02T15:04:05Z07:00 的格式。如果我们想要在 Gin 的 shouldBindJSON 方法中,传入 YYYY-MM-DD hh:mm:ss 格式的日期格式作为 time.Time 类型的值,就会引发类似于 parsing time xx as xx: cannot parse xx as xx 的报错信息。这是因为 time.Time 类型默认支持的日期格式与我们传入的格式不同,导致解析出错。。 遇到这个...阅读全文

博文 2020-04-04 19:34:27 晒兜斯

Thoughts on gin?

<p>I wanted to try something new instead of the built in http package. There aren&#39;t many frameworks for Go and I know they are mostly discouraged but gin looks good and have 14K stars so I hoped to hear your thoughts and review on it.</p> <hr/>**评论:**<br/><br/>earthboundkid: <pre><p>I prefer <a h...阅读全文

资源 2018-01-10 18:30:36 blov

使用 Go 添加文档

简介 swagger 起步 编写文档 运行 总结 当前部分的代码 简介 对于 API 服务来说, 文档是必不可少的. 然而文档却挺烦人的, 尤其是同步更新的问题. 如果选择手写文档, 经常会忘了更新文档;或者处于高速开发的前期, 来不及更新文档. 现在更推崇的方式是文档即注释, 就是将文档作为注释, 和代码同步更新,使用自动生成文档的方式实时更新. 另一种概念是文档即测试, 让文档不但能看, 也能用, 这对于 API 文档来说,是一个巨大的便利. 有了它, 再也不用一边看文档, 一边开着 Postman 实验了. 这就是 swagger. swagger 起步 swagger 提供了很多工具用于创建 API 文档, 尤其是创建了 RESTful APIs 标准. 这个 RESTful API...阅读全文

博文 2019-11-10 09:33:29 帅气猫咪