Go业务开发中常用的几个开源库
原文链接:Go业务开发中常用的几个开源库
前言
哈喽,大家好,我是asong
。拖更了好久,这周开始更新。
最近总有一些初学Go
语言的小伙伴问我在业务开发中一般都使用什么web框架、开源中间件;所以我总结了我在日常开发中使用到的库,这些库不一定是特别完美的,但是基本可以解决日常工作需求,接下来我们就来看一下。
Gin
Gin
是一个用Go
编写的Web
框架,它是一个类似于martini
但拥有更好性能的API
框架。基本现在每个Go
初学者学习的第一个web
框架都是Gin
。在网上看到一个关于对各个Go-web框架受欢迎的对比:文章图片
我们可以看到
Gin
在社区受欢迎排第一,Gin 框架往往是进行 Web 应用开发的首选框架,许多公司都会选择采用Gin
框架进行二次开发,加入日志,服务发现等功能,像Bilibili 开源的一套 Go 微服务框架 Kratos 就采用 Gin 框架进行了二次开发。学习
Gin
通过他的官方文档就可以很快入手,不过文档是英文的,这个不用担心,我曾翻译了一份中文版,可以到我的公众号后台获取,回复【gin】即可获取。github地址:https://github.com/gin-gonic/gin
zap
zap
是uber
开源的日志库,选择zap
他有两个优势:- 它非常的快
- 它同时提供了结构化日志记录和printf风格的日志记录
CPU
资源,不适用于业务开发场景,业务对性能敏感还是挺高的。zap
采用了不同的方法,它设计了一个无反射、零分配的 JSON 编码器,并且基础 Logger 力求尽可能避免序列化开销和分配。 通过在此基础上构建高级 SugaredLogger,zap 允许用户选择何时需要计算每次分配以及何时更喜欢更熟悉的松散类型的 API。zap
的基准测试如下:文章图片
可以看出
zap
的效率完全高于其他日志库,选谁不用我明说了吧!!!github地址:https://github.com/uber-go/zap
jsoniter
做业务开发离不开json
的序列化与反序列化,标准库虽然提供了encoding/json
,但是它主要是通过反射来实现的,所以性能消耗比较大。jsoniter
可以解决这个痛点,其是一款快且灵活的 JSON 解析器,具有良好的性能并能100%兼容标准库,我们可以使用jsoniter替代encoding/json,官方文档称可以比标准库快6倍多,后来Go官方在go1.12版本对 json.Unmarshal 函数使用 sync.Pool 缓存了 decoder,性能较之前的版本有所提升,所以现在达不到快6倍多。文章图片
github地址:https://github.com/json-itera...
对于
jsoniter
优化原理感兴趣的可以移步这里:http://jsoniter.com/benchmark...gorm
gorm
是一个使用Go
语言编写的ORM
框架,文档齐全,对开发者友好,并且支持主流的数据库:MySQL
, PostgreSQL
, SQlite
, SQL Server
。个人觉得使用
gorm
最大的好处在于它是由国人开发,中文文档齐全,上手很快,目前大多数企业也都在使用gorm
。我们来一下gorm
的特性:- 全功能 ORM
- 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
- Create,Save,Update,Delete,Find 中钩子方法
- 支持
Preload
、Joins
的预加载 - 事务,嵌套事务,Save Point,Rollback To Saved Point
- Context、预编译模式、DryRun 模式
- 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
- SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
- 复合主键,索引,约束
- Auto Migration
- 自定义 Logger
- 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
- 每个特性都经过了测试的重重考验
- 开发者友好
官方文档:https://gorm.io/zh_CN/docs/in...
robfig/cron
github地址:https://github.com/robfig/cron业务开发更离不开定时器的使用了,
cron
就是一个用于管理定时任务的库,用 Go 实现 Linux 中crontab
这个命令的效果,与Linux 中crontab
命令相似,cron
库支持用 5 个空格分隔的域来表示时间。cron
上手也是非常容易的,看一个官方的例子:package mainimport (
"fmt"
"time""github.com/robfig/cron/v3"
)func main() {
c := cron.New()c.AddFunc("@every 1s", func() {
fmt.Println("tick every 1 second run once")
})
c.Start()
time.Sleep(time.Second * 10)
}
针对
cron
的使用可以参考这篇文章:https://segmentfault.com/a/11...之前我也写了一篇
cron
的基本使用,可以参考下:https://mp.weixin.qq.com/s/Z4...wire
【Go业务开发中常用的几个开源库】都1202
年了,应该不会有人不知道依赖注入的作用了吧。我们本身也可以自己实现依赖注入,但是这是在代码量少、结构不复杂的情况下,当结构之间的关系变得非常复杂的时候,这时候手动创建依赖,然后将他们组装起来就会变的异常繁琐,并且很容出错。Go语言社区有很多依赖注入的框架,可以分为两个类别:- 依赖反射实现的运行时依赖注入:inject、uber、dig
- 使用代码生成实现的依赖注入:wire
wire
进行项目管理是最好的,在代码编译阶段就可以发现依赖注入的问题,在代码生成时即可报出来,不会拖到运行时才报,更便于 debug
。wire
的使用也是非常的简单,关于wire
的使用我之前也写了一篇文章,可以参考一下:https://mp.weixin.qq.com/s/Z4...github地址:https://github.com/google/wire
ants
某些业务场景还会使用到goroutine
池,ants
就是一个广泛使用的goroute池,可以有效控制协程数量,防止协程过多影响程序性能。ants
也是国人开发的,设计博文写的也很详细的,目前很多大厂也都在使用ants
,经历过线上业务检验的,所以可以放心使用。github地址:https://github.com/panjf2000/...
ants
源码不到1k
行,建议大家赏析一下源码~。总结 本文列举的几个库都是经常被使用的开源库,这几个库你都掌握了,基本的业务开发都没有啥问题了,一些初学者完全可以通过这几个库达到入门水平。还有一些库,比如:
go-redis
、go-sql-driver
、didi/gendry
、golang/groupcache
、olivere/elastic/v7
等等,这些库也是经常使用的,入门都比较简单,就不这里详细介绍了。如果大家也有经常使用的,比较好的开源库,欢迎推荐给我,我也学习学习!!!
好啦,本文就到这里了,素质三连(分享、点赞、在看)都是笔者持续创作更多优质内容的动力!我是
asong
,我们下期见。欢迎关注公众号:【Golang梦工厂】
推荐往期文章:
- 学习channel设计:从入门到放弃
- 详解内存对齐
- 警惕请勿滥用goroutine
- 源码剖析panic与recover,看不懂你打我好了!
- 面试官:小松子来聊一聊内存逃逸
- 面试官:两个nil比较结果是什么?
- Go语言如何操纵Kafka保证无消息丢失
推荐阅读
- 深入理解Go之generate
- python学习之|python学习之 实现QQ自动发送消息
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 我的软件测试开发工程师书单
- echart|echart 双轴图开发
- NPDP拆书(三)(新产品开发战略(经营与创新战略))
- 芯灵思SinlinxA33开发板Linux内核定时器编程
- 常用git命令总结
- 藏族开发的修路人——记致富援乡的斯定那珠
- ASP.NET|ASP.NET Core应用开发思维导图