Go业务开发中常用的几个开源库转载本文请联系Golang梦工厂公众号。前言大家好,我是asong。耽误了好久,这周开始更新。最近总有刚接触Go语言的朋友问我在业务开发中一般用什么web框架和开源中间件;所以我总结一下我在日常开发中使用的库。这些库不一定是完美的。不过基本可以解决日常的工作需求,接下来我们一起来看看吧。GinGin是一个用Go编写的Web框架,是一个类似于martini但性能更好的API框架。基本上,现在每个Go初学者学习的第一个Web框架就是Gin。在网上看到了一个Go-web框架的流行度对比:从网上可以看出社区中最受欢迎的是Gin,Gin框架往往是web应用开发的首选框架。很多公司会选择使用Gin框架进行二次开发,增加日志、服务发现等功能。比如哔哩哔哩开源的一套Go微服务框架Kratos,就是采用Gin框架进行二次开发。你可以通过它的官方文档快速学习Gin,但是文档是英文的,不用担心。我曾经翻译过一个中文版,可以在我的公众号后台获取,回复[gin]即可获取。Github地址:https://github.com/gin-gonic/ginzapZap是uber开源的日志库。选择zap有两个好处:速度非常快,同时提供结构化日志记录和printf风格的日志记录大多数日志库基本上都是基于反射序列化和字符串格式化,这会在日志上占用大量的CPU资源,这不是适合业务发展场景,业务对性能比较敏感。zap采用了不同的方法,设计了一个无反射、零分配的JSON编码器,底层的Logger力求尽可能避免序列化开销和分配。通过在此基础上构建高级SugaredLogger,zap允许用户选择何时需要计算每个分配以及何时他们更喜欢更熟悉的松散类型API。zap的benchmark测试如下:从官方文档可以看出,zap的效率完全高于其他日志库。我不需要解释选择谁!github地址:https://github.com/uber-go/zapjsoniter业务开发离不开json的序列化和反序列化。标准库虽然提供了encoding/json,但是主要是通过反射实现的,所以性能消耗比较大。jsoniter可以解决这个痛点。它是一个快速灵活的JSON解析器,具有良好的性能和与标准库100%的兼容性。我们可以使用jsoniter而不是encoding/json。官方文档说可以比标准库快6倍以上,后来Go在go1.12版本正式使用sync.Pool来缓存json.Unmarshal函数的解码器。与以前的版本相比,性能有所提高,因此现在快了不到6倍。来自官方文档github地址:https://github.com/json-iterator/go对jsoniter优化原理感兴趣的可以移步这里:http://jsoniter.com/benchmark.html#optimization-usedgormgorm是一个用Go语言编写的ORM框架,文档完善,对开发者友好,支持主流数据库:MySQL、PostgreSQL、SQlite、SQLServer。个人觉得用gorm最大的好处就是它是国人开发的,中文文档齐全,上手快。目前大部分公司也在使用gorm。来看看gorm的特点:全功能的ORM关联(HasOne,HasMany,BelongsTo,ManyToMany,多态,单表继承)Create,Save,Update,Delete,Findhook方法支持Preload,Joins加载事务、嵌套事务、保存点、回滚到保存点上下文、预编译模式、DryRun模式批量插入、FindInBatches、使用Map查找/创建、使用SQL表达式的CRUD、ContextValuerSQLBuilder、Upsert、数据库锁、优化器/索引/CommentHint、命名参数、子查询、复合主键、索引、约束AutoMigration自定义Logger灵活可扩展的插件API:DatabaseResolver(多数据库、读写分离)、Prometheus……每个特性都通过了测试测试开发者友好的github地址:https://github.com/go-gorm/gorm官方文档:https://gorm.io/zh_CN/docs/index.htmlrobfig/crongithub地址:https://github.com/robfig/cron业务发展离不开t的使用计时器。cron是一个用于管理定时任务的库。使用Go实现Linux中crontab命令的效果。它类似于Linux中的crontab命令。cron库支持时间表示为由5个空格分隔的字段。cron的入门也很简单,看官方的一个例子:packagemainimport("fmt""time""github.com/robfig/cron/v3")funcmain(){c:=cron.New()c.AddFunc("@every1s",func(){fmt.Println("tickevery1secondrunonce")})c.Start()time.Sleep(time.Second*10)}cron的使用可以参考这篇文章:https://段错误。com/a/1190000023029219之前,我也写了一篇cron的基本使用,大家可以参考:https://mp.weixin.qq.com/s/Z4B7Tn8ikFIkXVGhXNbsVAwire1202岁,应该没有人不知道关于依赖注入它起作用了。我们也可以自己实现依赖注入,但这是在代码量小,结构不复杂的情况下。当结构之间的关系变得很复杂的时候,这时候就手动创建依赖,然后再进行组装。它变得极其繁琐且容易出错。Go语言社区有很多依赖注入框架,大致可以分为两大类:通过反射实现的运行时依赖注入:inject,uber,dig通过代码生成实现的依赖注入:wire我个人认为使用wire进行项目管理是最好嘛,依赖注入的问题在代码编译阶段就可以发现,在代码生成的时候就可以报错,不会拖到运行时才报错,更方便调试。电线的使用也很简单。之前也写过一篇关于线材使用的文章。可以参考:https://mp.weixin.qq.com/s/Z4B7Tn8ikFIkXVGhXNbsVAGithub地址:https://github.com/google/wireants的一些业务场景也使用了goroutinepool。ants是一个应用广泛的goroutinepool,可以有效控制协程数量,防止协程过多影响程序性能。ants也是国人开发的,设计博文也很详细。目前很多大厂也在用蚂蚁,而且都经过线上商检,大家可以放心使用。github地址:https://github.com/panjf2000/antantants源码不足1k行,建议欣赏源码~。综上所述,本文列出的库都是经常使用的开源库。这些库你都掌握了,基本的业务开发是没有问题的。一些初学者可以使用这些库来达到入门水平。还有一些库,比如:go-redis、go-sql-driver、didi/gendry、golang/groupcache、olivere/elastic/v7等,这些库也是经常用到的,入门也比较简单,所以我不会在这里详细介绍它们。
