Go 业务开发中常用的几个开源库

标签: dev | 发表时间:2021-10-19 00:00 | 作者:
出处:http://itindex.net/relian

前言

哈喽,大家好,我是 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

zapuber开源的日志库,选择 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-iterator/go

对于 jsoniter优化原理感兴趣的可以移步这里:http://jsoniter.com/benchmark.html#optimization-used

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 中钩子方法
  • 支持 PreloadJoins的预加载
  • 事务,嵌套事务,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/index.html

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/1190000023029219

之前我也写了一篇 cron的基本使用,可以参考下:https://mp.weixin.qq.com/s/Z4B7Tn8ikFIkXVGhXNbsVA

wire

1202年了,应该不会有人不知道依赖注入的作用了吧。我们本身也可以自己实现依赖注入,但是这是在代码量少、结构不复杂的情况下,当结构之间的关系变得非常复杂的时候,这时候手动创建依赖,然后将他们组装起来就会变的异常繁琐,并且很容出错。Go语言社区有很多依赖注入的框架,可以分为两个类别:

  • 依赖反射实现的运行时依赖注入:inject、uber、dig
  • 使用代码生成实现的依赖注入:wire

个人觉的使用 wire进行项目管理是最好的,在代码编译阶段就可以发现依赖注入的问题,在代码生成时即可报出来,不会拖到运行时才报,更便于 debug

wire的使用也是非常的简单,关于 wire的使用我之前也写了一篇文章,可以参考一下:https://mp.weixin.qq.com/s/Z4B7Tn8ikFIkXVGhXNbsVA

github地址:https://github.com/google/wire

ants

某些业务场景还会使用到 goroutine池, ants就是一个广泛使用的goroute池,可以有效控制协程数量,防止协程过多影响程序性能。 ants也是国人开发的,设计博文写的也很详细的,目前很多大厂也都在使用 ants,经历过线上业务检验的,所以可以放心使用。

github地址:https://github.com/panjf2000/ants

ants源码不到 1k行,建议大家赏析一下源码~。

总结

本文列举的几个库都是经常被使用的开源库,这几个库你都掌握了,基本的业务开发都没有啥问题了,一些初学者完全可以通过这几个库达到入门水平。还有一些库,比如: go-redisgo-sql-driverdidi/gendrygolang/groupcacheolivere/elastic/v7等等,这些库也是经常使用的,入门都比较简单,就不这里详细介绍了。

如果大家也有经常使用的,比较好的开源库,欢迎推荐给我,我也学习学习!!!

好啦,本文就到这里了,素质三连(分享、点赞、在看)都是笔者持续创作更多优质内容的动力!我是 asong,我们下期见。

创建了读者交流群,欢迎各位大佬们踊跃入群,一起学习交流。入群方式:关注公众号获取。更多学习资料请到公众号领取。

推荐往期文章:

相关 [go 业务 开发] 推荐:

Go 业务开发中常用的几个开源库

- - IT瘾-dev
哈喽,大家好,我是 asong. 最近总有一些初学 Go语言的小伙伴问我在业务开发中一般都使用什么web框架、开源中间件;所以我总结了我在日常开发中使用到的库,这些库不一定是特别完美的,但是基本可以解决日常工作需求,接下来我们就来看一下. Gin是一个用 Go编写的 Web框架,它是一个类似于 martini但拥有更好性能的 API框架.

文章: Go语言开发工具LiteIDE

- - InfoQ cn
Go语言最初在2009年11月对外公布,在2011年3月16日发布第一个release,第一个正式版本Go1于2012年3月28日推出. 在Go语言的正式版本推出后,Eclipse、IntelliJ IDEA、vim、emacs、gedit、SublimeText2、Textmate、Textpad、SciTE、Notepad++等IDE和编辑器开始纷纷有了各自的Go语言插件.

Go和HTTPS

- - Tony Bai
近期在构思一个产品,考虑到安全性的原因,可能需要使用到 HTTPS协议以及双向数字证书校验. 之前只是粗浅接触过HTTP( 使用Golang开 发微信系列). 对HTTPS的了解则始于那次 自行搭建ngrok服务,在那个过程中照猫画虎地为服务端生成了一些私钥和证书,虽然结果是好 的:ngrok服务成功搭建起来了,但对HTTPS、数字证书等的基本原理并未求甚解.

Valve宣布CS: GO

- 小D - Solidot
此前媒体曾报告说Valv邀请CSS玩家和社区代表访问其总部,现在谜团已经解开:Valv宣布了团队射击游戏Counter-Strike: Global Offensive,它将在2012年初登陆Steam(PC和Mac)、PS3和Xbox360. CS: GO将是12年前发布的CS的真正扩展,而不是类似CS:Source的引擎更新,它提供了新的地图、角色、武器,经典CS地图(如de_dust),新的游戏模式,配对比赛和排名榜等.

Go 语言初步

- wei - 云风的 BLOG
所谓认真玩,就是拿 Go 写点程序,前后大约两千行吧. 据说 Go 的最佳开发平台是 Mac OS ,我没有. Windows 版还没全部搞定,但是也可以用了. 如果你用 google 搜索,很容易去到一个叫 go-windows 的开源项目上. 如果你用这个,很多库都没有,而且语法也是老的. 我在 Windows 下甚至不能正确链接自己写的多个 package.

Go 1.1 的性能提升

- - 博客 - 伯乐在线
伯乐在线注:今天上午在微博推荐了英文原文,感谢 @Codefor 的热心翻译. 如果其他朋友也有不错的原创或译文,可以尝试 推荐给我们. 这是Go1.1发布后性能提升分析系列的第一篇文章. Go官方文档( 这里和 这里)报告说,用Go1.1重新编译你的代码就可以获得30%-40%的性能提升.

采访:关于 Go 语言和《Go Web编程》

- - 开源中国社区最新新闻
最近,在网上出现了一本名为《Go Web编程》的书籍,里面详细地讲述了使用Go语言进行Web编程的各个方面. 很特别的是,这本书是在GitHub上以开源的方式撰写的. 日前,InfoQ采访了这本书的作者谢孟军先生,请他来和大家谈谈Go语言以及他撰写的开源书籍. InfoQ:请您先简单和大家介绍一下自己.

《学习Go语言》0.4 中文版

- way - python.cn(jobs, news)
鱼哥(https://twitter.com/#!/smallfishxy)上个月勒令我要完成 0.4 版的翻译. 之前公司重组的时候,没顾上看英文版本的更新,结果这老外不声不响的做了如此之多的改动……. 于是只好人工 diff,一条一条的对比 commit 内容. 总算是跟进到了 0.4 这个 tag.

Skype 被強制安裝 EasyBits Go

- MorrisC - 高登工作室
這是由網友 LuLu CHEN 所提供的資訊,我自己的Skype是沒有出現這樣子的訊息,如果你也是被強制安裝此一程式的話,請照著本篇的方法將它移除吧. Spype是大家最常用的語音IM即時通訊軟體,這個月初Skype還以85億美元的天價嫁給了微軟,但是怎麼送給大家的禮物卻是一個大家不想要的流氓軟體.

Opal :未曾发布的 7 寸 TouchPad Go

- SotongDJ - 爱范儿 · Beats of Bits
惠普的 TouchPad 是一部带有悲情色彩的平板电脑,它的降价策略和销量已经成为了漫画家和脱口秀主持人的好材料. 翻看过去的新闻,我们发现除了 9.7  寸的 TouchPad 之外,还存在一部代号为 Opal 的“迷你 TouchPad”,它真正的名字是 TouchPadGo , Go 在 TouchPad 的右上角形成一个特立独行的商标.