Go日常开发常用第三方库和工具介绍

这里我主要将这些库分为两类:

  • 业务开发
  • 基础工具开发

业务开发

首先是业务开发,主要包含了 web、数据库、Redis 等。

Gin ️️️️️

首先是 Gin,一款 HTTP 框架,使用简单、性能优秀、资料众多;你还在犹豫选择哪款框架时,那就选择它吧,基本没错。

当然和它配套的 github.com/swaggo/gin-… swagger 工具也是刚需;利用它可以生成 swagger 文档。

GORM ️️️️️

GORM 也没啥好说的,如果你喜欢 orm 的方式操作数据库,那就选它吧;同样的也是使用简单、资料较多。

如果有读写分离需求,也可以使用 GORM 官方提供的插件 github.com/go-gorm/dbr… ,配合 GORM 使用也是非常简单。

errors ️️️️️

Go 语言自身提供的错误处理比较简单,github.com/pkg/errors 提供了更强大的功能,比如:

  • 包装异常
  • 包装堆栈等。

常用的有以下 API:

// WithMessagef annotates err with the format specifier.
func WithMessagef(err error, format string, args ...interface{}) error

// WithStack annotates err with a stack trace at the point WithStack was called.
func WithStack(err error) error

zorolog ️️️️️

Go 里的日志打印库非常多,日志在日常开发中最好就是存在感低;也就是说性能强(不能影响到业务代码)、使用 API 简单。

"github.com/rs/zerolog/log"
log.Debug().Msgf("OrderID :%s", "12121")

excelize

github.com/qax-os/exce…是一个读写 Excel 的库,基本上你能遇到的 Excel 操作它都能实现。

now ️️️️

github.com/jinzhu/now 是一个时间工具库:

  • 获取当前的年月日、时分秒。
  • 不同时区支持。
  • 最后一周、最后一个月等。
import "github.com/jinzhu/now"

time.Now() // 2013-11-18 17:51:49.123456789 Mon

now.BeginningOfMinute()        // 2013-11-18 17:51:00 Mon
now.BeginningOfHour()          // 2013-11-18 17:00:00 Mon
now.BeginningOfDay()           // 2013-11-18 00:00:00 Mon
now.BeginningOfWeek()          // 2013-11-17 00:00:00 Sun
now.BeginningOfMonth()         // 2013-11-01 00:00:00 Fri
now.BeginningOfQuarter()       // 2013-10-01 00:00:00 Tue
now.BeginningOfYear()          // 2013-01-01 00:00:00 Tue

now.EndOfMinute()              // 2013-11-18 17:51:59.999999999 Mon
now.EndOfHour()                // 2013-11-18 17:59:59.999999999 Mon
now.EndOfDay()                 // 2013-11-18 23:59:59.999999999 Mon
now.EndOfWeek()                // 2013-11-23 23:59:59.999999999 Sat
now.EndOfMonth()               // 2013-11-30 23:59:59.999999999 Sat
now.EndOfQuarter()             // 2013-12-31 23:59:59.999999999 Tue
now.EndOfYear()                // 2013-12-31 23:59:59.999999999 Tue

now.WeekStartDay = time.Monday // Set Monday as first day, default is Sunday
now.EndOfWeek()                // 2013-11-24 23:59:59.999999999 Sun

Decimal ️️️️

当业务上需要精度计算时 github.com/shopspring/… 可以帮忙。

import (
	"fmt"
	"github.com/shopspring/decimal"
)

func main() {
	price, err := decimal.NewFromString("136.02")

	quantity := decimal.NewFromInt(3)
	fee, _ := decimal.NewFromString(".035")
	taxRate, _ := decimal.NewFromString(".08875")

	subtotal := price.Mul(quantity)

	preTax := subtotal.Mul(fee.Add(decimal.NewFromFloat(1)))

	total := preTax.Mul(taxRate.Add(decimal.NewFromFloat(1)))

	fmt.Println("Subtotal:", subtotal)                      // Subtotal: 408.06
	fmt.Println("Pre-tax:", preTax)                         // Pre-tax: 422.3421
	fmt.Println("Taxes:", total.Sub(preTax))                // Taxes: 37.482861375
	fmt.Println("Total:", total)                            // Total: 459.824961375
	fmt.Println("Tax rate:", total.Sub(preTax).Div(preTax)) // Tax rate: 0.08875
}

基本上你能想到的精度转换它都能做到;配合上 GORM 也可以将 model 字段声明为 decimal 的类型,数据库对应的也是 decimal ,这样使用起来时会更方便。

Amount decimal.Decimal `gorm:"column:amout;default:0.0000;NOT NULL" json:"amout"`

configor ️️️️

github.com/jinzhu/conf… 是一个配置文件读取库,支持 YAML/JSON/TOML 等格式。

go-cache ️️️

github.com/patrickmn/g… 是一个类似于 Java 中的 Guava cache,线程安全,使用简单;不需要分布式缓存的简单场景可以考虑。

	c := cache.New(5*time.Minute, 10*time.Minute)
	// Set the value of the key "foo" to "bar", with the default expiration time
	c.Set("foo", "bar", cache.DefaultExpiration)

copier ️️️

github.com/jinzhu/copi… 看名字就知道这是一个数据复制的库,与 Java 中的 BeanUtils.copy() 类似;可以将两个字段相同但对象不同的 struct 进行数据复制,也支持深拷贝。

func Copy(toValue interface{}, fromValue interface{}) (err error)

在我们需要一个临时 struct 来存放数据时很有用,特别是一个 struct 中字段非常多时,一个个来回赋值确实有点费手指。

但也要注意不要什么情况都使用,会带来一些弊端:

  • 当删除字段时,不能利用编译器提示。
  • 当一些字段需要额外人工处理时,代码不易阅读。
  • 反射赋值,有一定性能损耗。

总之在业务开发时,还是建议人工编写,毕竟代码是给人看的。

env ️️️

github.com/caarlos0/en… 这个库可以将我们的环境变量转换为一个 struct.

type config struct {
	Home string `env:"HOME"`
}

func main() {
	cfg := config{}
	if err := env.Parse(&cfg); err != nil {
		fmt.Printf("%+v\n", err)
	}

	fmt.Printf("%+v\n", cfg)
}

这个在我们打包代码到不同的运行环境时非常有用,利用它可以方便的获取不同环境变量。

user_agent ️️️

github.com/mssola/user… 是一个格式化 user-agent 的小工具。

当我们需要在服务端收集 user-agen 时可以更快的读取数据。

func main() {
    ua := user_agent.New("Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1")

    fmt.Printf("%v\n", ua.Mobile())   // => true
    fmt.Printf("%v\n", ua.Bot())      // => false
    fmt.Printf("%v\n", ua.Mozilla())  // => "5.0"
    fmt.Printf("%v\n", ua.Model())    // => "Nexus One"
    fmt.Printf("%v\n", ua.Platform()) // => "Linux"
    fmt.Printf("%v\n", ua.OS())
    }

phonenumbers ️️️

github.com/nyaruka/pho… 手机号码验证库,可以不用自己写正则表达式了。

// parse our phone number
num, err := phonenumbers.Parse("6502530000", "US")

基础工具

接下来是一些基础工具库,包含一些主流的存储的客户端、中间件等。

gomonkey ️️️️️

github.com/agiledragon… 是一个 mock 打桩工具,当我们写单元测试时,需要对一些非接口函数进行 mock 会比较困难,这时就需要用到它了。

由于它是修改了调用对应函数时机器跳转指令,而 CPU 架构的不同对应的指令也不同,所以在我们使用时还不兼容苹果的 M1 芯片,不过目前应该已经兼容了,大家可以试试。

goconvey ️️️️️

github.com/smartystree… 也是配合单元测试的库,可以兼容 go test 命令。

  • 提供可视化 web UI。
  • 与 IDE 集成显示单元覆盖率。

dig ️️️️️

github.com/uber-go/dig 这是一个依赖注入库,我们这里暂不讨论是否应该使用依赖注入,至少目前我们使用下来还是有几个好处:

  • 所有的对象都是单例。
  • 有一个统一的地方管理对象。
  • 使用时直接传递对象当做参数进来即可(容器会自动注入)。

当然也有一些不太方便的地方:

  • 不熟悉时,一个对象是如何创建的不清楚。
  • 代码不是很好理解。

我们内部有自己开发一个业务框架,其中所有的对象都交由 dig 进行管理,使用起来倒也是比较方便。

cobra ️️️️

github.com/spf13/cobra是一个功能强大的命令行工具库,我们用它来实现内部的命令行工具,同时也推荐使用 github.com/urfave/cli/ 我个人会更习惯用后者,要简洁一些。

BloomRPC ️️️️

github.com/uw-labs/blo… 一个 gRPC 可视化工具,比起自己写 gRPC 客户端的代码那确实是要简单许多。

但也有些小问题,比如精度。如果是 int64 超过了 2^56 服务端拿到的值会发生错误,这点目前还未解决。

redis ️️️️

github.com/go-redis/re… Redis 客户端,没有太多可说的;发展了许多年,该有的的功能都有了。

elastic ️️️️

github.com/olivere/ela… 这也是一个非常成熟的 elasticsearch 库。

resty ️️️️

github.com/go-resty/re… 一个 http client, 使用起来非常简单:

// Create a Resty Client
client := resty.New()
resp, err := client.R().
    EnableTrace().
    Get("https://httpbin.org/get")

有点 Python requests 包那味了。

pulsar-client-go ️️️

Pulsar 官方出品的 go 语言客户端,相对于 Java 来说其他语言的客户端几乎都是后娘养的;功能会比较少,同时更新也没那么积极;但却没得选。

go-grpc-middleware ️️️

github.com/grpc-ecosys… 官方提供的 gRPC 中间件,可以自己实现内部的一些鉴权、元数据、日志等功能。

go-pilosa ️️️

github.com/pilosa/go-p… 是一个位图数据库的客户端,位图数据库的场景应用比较有限,通常是有标签需求时才会用到;比如求 N 个标签的交并补集;数据有一定规模后运营一定会提相关需求;可以备着以备不时之需。

pb ️️️

github.com/cheggaaa/pb 一个命令行工具进度条,编写命令行工具时使用它交互会更优雅。

总结

最后我汇总了一个表格,方便查看:

名称 类型 功能 星级
Gin 业务开发 HTTP 框架 ️️️️️
GORM 业务开发 ORM 框架 ️️️️️
errors 业务开发 异常处理库 ️️️️️
zorolog 业务开发 日志库 ️️️️️
excelize 业务开发 Excel相关需求 ️️️️️
now 业务开发 时间处理 ️️️️️
Decimal 业务开发 精度处理 ️️️️️
configor 业务开发 配置文件 ️️️️️
go-cache 业务开发 本地缓存 ️️️
copier 业务开发 数据复制 ️️️️️
env 业务开发 环境变量 ️️️️️
user_agent 业务开发 读取 user-agent ️️️️️
phonenumbers 业务开发 手机号码验证 ️️️️️
gomonkey 基础工具 mock工具 ️️️️
goconvey 基础工具 单测覆盖率 ️️️️
dig 基础工具 依赖注入 ️️️️
cobra 基础工具 命令行工具 ️️️
cli 基础工具 命令行工具 ️️️
BloomRPC 基础工具 gRPC 调试客户端 ️️️
redis 基础工具 Redis 客户端 ️️️
elastic 基础工具 elasticsearch 客户端 ️️️
resty 基础工具 http 客户端 ️️️
pulsar-client-go 基础工具 Pulsar 客户端 ️️️
go-grpc-middleware 基础工具 gRPC 中间件 ️️
go-pilosa 基础工具 pilosa 客户端 ️️️
pb 基础工具 命令行工具进度条 ️️️

更多关于Go日常开发常用第三方库和工具请点击下面的相关链接

(0)

相关推荐

  • Go 第三方库之类型转换问题

    目录 01 为什么需要类型转换 02 spf13/cast 1)To_ 形式函数 2)To_E 形式函数 03 总结 强类型语言有它的优势,但也有不便利的地方,最典型的就是类型转换.Golang 作为一门强类型语言,而且不支持隐式类型转换,因此这个问题更突出.虽然 Go 提供了不少方式进行类型转换,包括相关的标准库,比如 strconv 包. 然而,strconv 包使用没那么方便,比如 "8" 转为 int 类型: s := "8" i, err := strco

  • 手把手教你导入Go语言第三方库

    目录 环境 环境变量 实践导包 最好的学习方式就是实践. 我们通过导入gin包来深入学习. 环境 go 1.13.5 goland 2019.3.1 manjaro-gnome3.34.2 环境变量 首先回想一下,我们安装goland的时候,设置了几个比较重要的环境变量,也就是GOROOT和GOPATH. GOROOT比较容易理解.也就是我们go语言的安装目录,标准库什么的就放在里面的.在linux中的话,默认安装到/usr/lib/go中,我们创建项目时选择的SDK也就是这个. GOPATH可

  • 使用Cargo工具高效创建Rust项目

    目录 前言 一.功能强大的Cargo工具 1.Cargo工具是什么? 2.使用Cargo命令创建 hello_cargo 项目 3.项目文件目录里各文件的内容和特点 4.Cargo 常用命令 二.Rust 语言的输入输出 1.输入输出测试 2.具体代码解析 前言 本文紧跟上篇Rust博文内容,讲解Cargo工具在Rust项目创建时的妙用,手把手教你使用Cargo工具在黑窗口创建项目.此外,创建项目之后,简单的做一个Rust语言中输入输出的测试,上文提到学好Rust语言的方法就是一步一步打基础,因

  • Go编写定时器与定时任务详解(附第三方库gocron用法)

    目录 Go 编写定时器和定时任务 Timer Ticker gocron 安装 Demo 总结 Go 编写定时器和定时任务 在 项目开发当中,可能会遇到这样的场景: 1 A任务需要在多久之后执行一次(定时器) 2.B任务需要每隔多长时间执行一次 (定时任务) 谈到定时任务,离不开linux的crontab. 先简单了解下crontab // 每隔1秒执行一次 */1 * * * * ? // 每隔1分钟执行一次 0 */1 * * * ? // 每天0点执行一次 0 0 0 * * ? // 每

  • Go代码检查的推荐工具及使用详解

    目录 1. Golint 2. Golangci-lint 3. Go-reporter 1. Golint (1)安装golint git clone https://github.com/golang/lint.git cd lint/golint go install (2)使用方式 # 检查单个文件 golint service.go # 检查当前目录所有.go文件,不会递归查找 golint (3)golint校验规则 不能使用下划线命名法,使用驼峰命名法 外部可见程序结构体.变量.函

  • go第三方库sqlx操作MySQL及ORM原理

    目录 sqlx实战 准备工作 编写代码 添加引用 创建连接 增删改查 预处理语句 数据库事务 sqlx干了什么 MustXXX NamedXXX XXXScan sqlx是Golang中的一个知名三方库,其为Go标准库database/sql提供了一组扩展支持.使用它可以方便的在数据行与Golang的结构体.映射和切片之间进行转换,从这个角度可以说它是一个ORM框架:它还封装了一系列地常用SQL操作方法,让我们用起来更爽. sqlx实战 这里以操作MySQL的增删改查为例. 准备工作 先要准备一

  • golang构建工具Makefile使用详解

    目录 正文 正文 可能是因为编译太简单了,golang 并没有一个官方的构建工具(类似于 java 的 maven 和 gradle之类的),但是除了编译,我们可能还需要下载依赖,运行测试,甚至像 easyjson,protobuf,thrift 这样的工具下载和代码生成,如果没有构建工具,这些工作就会非常麻烦 为了解决这个问题,之前写过一个 everything.sh 的脚本,把所有的操作都封装在这个脚本里面,只需要执行类似于 sh everything.sh dependency 的命令就可

  • Go语言包管理工具Godep的用法

    一.为什么要包管理 默认Go的第三方包都是放在Gopath的src目录下,而且这些包都没有版本号的概念,这样的可能会出现一些问题. 举个例子:当A同事将开发完程序之后,此时可能引用了一个第三方的包,过了不久之后,B同事接手了该项目,此时如果B同事通过go get 命令获取了包,而且包的版本进行了升级,恰巧这个包又不兼容以前的版本,这就会导致程序编译错误等问题.或者当这个维护的第三方包删除了,那么B同学则不能下载到该包. 由上面的例子就能知道,为什么需要进行包的依赖管理了. go里面进行包依赖管理

  • golang gopm get -g -v 无法获取第三方库的解决方案

    gopm get -g -v golang.org/x/text //网络不通 [GOPM] ?[36m03-14 07:36:49?[0m [?[31mERROR?[0m] golang.org/x/text: fail to make request: Get https://gopm.io/api/v1/revision?pkgname=golang.org/x/text: dial tcp: look up gopm.io: getaddrinfow: This is usually a

  • golang 输出重定向:fmt Log,子进程Log,第三方库logrus的详解

    独立 fmt Log输出重定向 golang的fmt包的输出函数 Println.Printf.PrintStack等,默认将打印输出到os.Stdout.错误打印输出到os.Stderr,os.Stdout 和 os.Stderr 默认值 /dev/stdout /dev/stderr 设备. //代码摘自:golang封装包 -> /lib/golang/src/os var ( Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin&q

随机推荐