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

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等等,这些库也是经常使用的,入门都比较简单,就不这里详细介绍了。

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

(0)

相关推荐

  • Go实战:Vue.js + Golang 组合打造应用

    GCTT:M1seRy Go语言中文网 2021-09-25 时间回到 2018 年,我写了一篇获得 15k 阅读的文章:Django + Angular 4 = A powerful Web app ...

  • Go语言开发的Web框架

    Go语言由Google公司开发,并于2009年开源,相比Java/Python/C等语言,Go尤其擅长并发编程,性能堪比C语言,开发效率肩比Python,被誉为"21世纪的C语言" ...

  • Go语言网络编程入门不走弯路最佳案例(写Api接口)

    Go语言是Google领导开发的一门编程语言,国内可访问的官网 https://golang.google.cn/ image-20201213123438844 只要选对了框架,用Go语言完成网络编 ...

  • 将百度万年历存入自己的数据库

    Github地址 前言 最近有需要研究阴历和阳历互相转换的问题.因此找到两个库carbon和solarlunar 但是感觉计算出来的总是不太放心,而且也会占用计算资源.我的想法是通过接口获取现成的阴历 ...

  • [系列] Go - 常用签名算法的基准测试

    签名验证是为了保证接口安全和识别调用方身份,同时还需要满足以下几点: 可变性:每次的签名必须是不一样的. 时效性:每次请求的时效性,过期作废. 唯一性:每次的签名是唯一的. 完整性:能够对传入数据进行 ...

  • 效率提高80%,Go开发必备的库与工具

    不知不觉写 Go 已经快一年了,上线了大大小小好几个项目:心态也经历了几轮变化. 因为我个人大概前五年时间写的是 Java ,中途写过一年多的 Python,所以刚接触到 Go 时的感觉如下图: 既没 ...

  • Golang 单元测试:有哪些误区和实践?

    阿里妹导读:单元测试作为开发的有力武器,应该在软件开发的各个流程中发挥它的价值.原始的开发模式(开发完毕,交给测试团队进行端到端测试)的流程,应该逐步向 devops 的方向转变.本文是一个转型的具体 ...

  • 开发中常用的命令和使用(基础)

    nginx的使用 1. 启动nginx :/etc/init.d/nginx start 2.停止nginx:/etc/init.d/nginx stop 3.重启nginx:/etc/init.d/ ...

  • 【收藏篇】Android 开发中常用的10种工具类

    导语 Android开发中,收集一些常用的代码工具类是非常重要的.现在Android开发技术已经很成熟了,很多代码大牛已经写出了很多框架和工具类,我们现在应该要站在巨人的肩膀上做开发了.今天我把平时开 ...

  • 嵌入式开发中常用的几种通信接口总结

    在嵌入式系统中,板上通信接口是指用于将各种集成电路与其他外围设备交互连接的通信通路或总线. 以下内容为常用板上通信接口:包括I2C.SPI.UART.1-Wire: I2C总线 I2C总线是一种同步. ...

  • 业务越来越复杂,领域驱动如何在业务开发中落地?

    最近一段时间,领域驱动和微服务受到了越来越多的关注.对于互联网从业者来说,业务会变得越来越复杂,这时候就需要一些系统的方法论来指导开发实现,目前业界关注比较多的方法论就是领域驱动.那么,领域驱动如何应 ...

  • SQL开发中常用到的几种去重方案

    SQL开发中常用到的几种去重方案 distinct去重 stinct只能返回他的目标字段,而无法返回其他字段, select distinct name from user 一般distinct用来查 ...

  • 我在架构设计和代码开发中的一些常用原则

    不管我一生中取得了多大的成功,其主要原因都不是我知道多少事情,而是我知道在无知的情况下自己应该怎么做.我一生中学到的最重要的东西是一种以原则为基础的生活方式,是它帮助我发现真相是什么,并据此如何行动. ...

  • 外贸业务工作中,460个常用英文词组的标准写法

    执行合同 execute/carry out/fulfill a contract 使合同生效 bring a contract into effect 违背/撤销和约 break/cancel a ...

  • 前端日常工作中常用开发小技巧 ---JavaScript

    前端日常工作中常用开发小技巧 ---JavaScript

  • 初中数学应用题中常用公式总结,收藏就赚到!

    GUIDE 导读 初中数学虽然没有高中那么复杂,但是知识点还是比较琐碎. 很多人学起来得心应手是因为对该阶段的数学有章可循. 那么今天老师给同学们整理一下初中数学应用题中常用到的公式,希望对同学们有所 ...