原文链接: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…
- 每个个性都通过了测试的重重考验
- 开发者敌对
github 地址:https://github.com/go-gorm/gorm
官网文档: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 main
import (
"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
都 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 保障无音讯失落