专栏首页小诚信驿站Gin-Web-Framework官方指南中文(上篇)

Gin-Web-Framework官方指南中文(上篇)

英文文档

GitHub

一、介绍

Gin是什么?

Gin是一个用Golang写的HTTP web框架。它具有类似于Martini的API,性能更高-快40倍。 如果需要很好的性能,那么肯定是推荐现在使用Gin。

特点:

快:

基于基数树的路由,占用内存少。 没有反射。 可预测的API性能

中间件支持:

进来的HTTP请求被中间件链处理然后最后执行。举个例子比如日志,鉴权,解压等行为拦截操作之后,将信息发送到DB

奔溃无影响:

gin能捕获在HTTP请求的异常并且恢复,通过这种方式,你的服务可以保证高可用,作为一个例子,他可以提供上报异常监控

JSON校验:

Gin能解析并且校验请求中的JSON,比如校验某些必填入值

路由分组:

更好路由,鉴权必要或者非必要,不同的API版本,另外,分组可以无限嵌套并且对性能不会造成影响

错误管理:

Gin提供了一个便利的方式去收集所有的错误发生在HTTP请求中的,最后一个中间件可以写他们到一个日志文件或者一个数据库并且通过网络发送传输。

内置渲染:

Gin提供了一个简单实用渲染的JSON、XML和HTML的方式

可扩展性:

创建一个新的中间件非常容易,仅仅是看看示例代码就能明白。

二、快速开始入门

前提条件:

go的版本1.9+,未来不再支持1.7或者1.8

安装:

首先是建立在已经安装golang和设置好了你的工作目录空间。

这里需要注意的一点是所有通过go下载的GitHub内容都在$GOPATH/src/github.com目录下

下载安装gin

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

代码引入包

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

可选项,如果需要使用http.StatusOK

import "net/http"

初始化本地仓库

使用一个vendor工具比如Govendor

 go get github.com/kardianos/govendor

创建项目文件夹并且打开

mkdir -p $GOPATH/src/github.com/myusername/project && cd "$_"

使用vendor初始化你的项目并且添加gin框架(如果这个时候报错找不到你的govendor,则你需要先执行一个命令行设置下你的执行gopath环境目录)

export PATH=$PATH:$(go env GOPATH)/bin
govendor init
govendor fetch github.com/gin-gonic/gin@v1.3

复制一个项目模板到项目(很可能会504网关超时)

curl https://raw.githubusercontent.com/gin-gonic/examples/master/basic/main.go > main.go

运行项目

go run main.go

开始入手项目

创建一个go 文件比如example.go

touch example.go

内容写入以下代码

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
}

然后运行代码,命令行

go run example.go

或者Goland

三、基准测试

可以参考指标-测试结果

Gin的默认的JSON包encoding/json

如果想用其他的jsoniter,可以

go build -tags=jsoniter . 

四、如何发布

Rendor发布

Google App Engine发布

参考文档

五、测试:如何写测试用例

使用net/http/httptest包来测试HTTP请求

假设你的代码服务

package main

func setupRouter() *gin.Engine {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.String(200, "pong")
	})
	return r
}

func main() {
	r := setupRouter()
	r.Run(":8080")
}

测试代码命名xxx_test.go

package main

import (
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestPingRoute(t *testing.T) {
	router := setupRouter()

	w := httptest.NewRecorder()
	req, _ := http.NewRequest("GET", "/ping", nil)
	router.ServeHTTP(w, req)

	assert.Equal(t, 200, w.Code)
	assert.Equal(t, "pong", w.Body.String())
}

原文链接:https://gin-gonic.com/docs/

原文作者:gin官网

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Gin-Web-Framework官方指南中文(下篇)

    ShouldBind,ShouldBindJSON,ShouldBindXML,ShouldBindQuery,ShouldBindYAML

    小诚信驿站
  • go的代码写作规范

    gopath环境变量指定了你工作区间的位置,默认是home目录下的go目录,eg:/home/go。

    小诚信驿站
  • 【技术创作101训练营】聊聊MyBatis源码

    大家好,我叫刘晓成,代名词的话是小诚信驿站,原因是来自大学创业的奶茶店,曾经大家倡导诚信,而我的愿望也是“晓成”相信这个诚信驿站。大家可以看下我的业务经验,工作...

    小诚信驿站
  • LeetCode 206题 反转链表(Reverse Linked List)

    题目描述: 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL

    code随笔
  • 如何在PP中通过添加列计算移动平均?

    逍遥之
  • LeetCode - K个一组翻转链表

    该题是四周前做的一道题目,当时写这题时刚好写了前面一题(之后会发出来),然后题目刚好是类似的,只需要稍微换个思路就可以了。这题的难度是困难,真的是为数不多的写出...

    晓痴
  • 链表中间数

    1、遍历的方式 时间复杂度:O(N) 空间复杂度:O(N) 2、快慢指针方式 时间复杂度:O(N) 空间复杂度:O(1)

    OPice
  • iOS开发中访问并修改一个类的私有属性

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

    用户1451823
  • 【Redis】NoSQL简介

    NoSQL最常见的解释是“non-relational”, “Not Only SQL”。泛指非关系型的数据库。它们不保证关系数据的ACID特性。 NoSQL...

    瑞新
  • Java---类反射(1)---类反射入门和基础

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态...

    谙忆

扫码关注云+社区

领取腾讯云代金券