Go日常開(kāi)發(fā)常用第三方庫(kù)和工具介紹
這里我主要將這些庫(kù)分為兩類(lèi):
- 業(yè)務(wù)開(kāi)發(fā)
- 基礎(chǔ)工具開(kāi)發(fā)
業(yè)務(wù)開(kāi)發(fā)
首先是業(yè)務(wù)開(kāi)發(fā),主要包含了 web
、數(shù)據(jù)庫(kù)、Redis
等。
Gin
首先是 Gin,一款 HTTP 框架,使用簡(jiǎn)單、性能優(yōu)秀、資料眾多;你還在猶豫選擇哪款框架時(shí),那就選擇它吧,基本沒(méi)錯(cuò)。
當(dāng)然和它配套的 github.com/swaggo/gin-… swagger 工具也是剛需;利用它可以生成 swagger 文檔。
GORM
GORM 也沒(méi)啥好說(shuō)的,如果你喜歡 orm
的方式操作數(shù)據(jù)庫(kù),那就選它吧;同樣的也是使用簡(jiǎn)單、資料較多。
如果有讀寫(xiě)分離需求,也可以使用 GORM
官方提供的插件 github.com/go-gorm/dbr… ,配合 GORM
使用也是非常簡(jiǎn)單。
errors
Go 語(yǔ)言自身提供的錯(cuò)誤處理比較簡(jiǎn)單,github.com/pkg/errors 提供了更強(qiáng)大的功能,比如:
- 包裝異常
- 包裝堆棧等。
常用的有以下 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 里的日志打印庫(kù)非常多,日志在日常開(kāi)發(fā)中最好就是存在感低;也就是說(shuō)性能強(qiáng)(不能影響到業(yè)務(wù)代碼)、使用 API 簡(jiǎn)單。
"github.com/rs/zerolog/log" log.Debug().Msgf("OrderID :%s", "12121")
excelize
github.com/qax-os/exce…是一個(gè)讀寫(xiě) Excel 的庫(kù),基本上你能遇到的 Excel 操作它都能實(shí)現(xiàn)。
now
github.com/jinzhu/now 是一個(gè)時(shí)間工具庫(kù):
- 獲取當(dāng)前的年月日、時(shí)分秒。
- 不同時(shí)區(qū)支持。
- 最后一周、最后一個(gè)月等。
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
當(dāng)業(yè)務(wù)上需要精度計(jì)算時(shí) 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 }
基本上你能想到的精度轉(zhuǎn)換它都能做到;配合上 GORM
也可以將 model
字段聲明為 decimal
的類(lèi)型,數(shù)據(jù)庫(kù)對(duì)應(yīng)的也是 decimal
,這樣使用起來(lái)時(shí)會(huì)更方便。
Amount decimal.Decimal `gorm:"column:amout;default:0.0000;NOT NULL" json:"amout"`
configor
github.com/jinzhu/conf… 是一個(gè)配置文件讀取庫(kù),支持 YAML/JSON/TOML
等格式。
go-cache
github.com/patrickmn/g… 是一個(gè)類(lèi)似于 Java 中的 Guava cache
,線程安全,使用簡(jiǎn)單;不需要分布式緩存的簡(jiǎn)單場(chǎng)景可以考慮。
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… 看名字就知道這是一個(gè)數(shù)據(jù)復(fù)制的庫(kù),與 Java
中的 BeanUtils.copy()
類(lèi)似;可以將兩個(gè)字段相同但對(duì)象不同的 struct
進(jìn)行數(shù)據(jù)復(fù)制,也支持深拷貝。
func Copy(toValue interface{}, fromValue interface{}) (err error)
在我們需要一個(gè)臨時(shí) struct 來(lái)存放數(shù)據(jù)時(shí)很有用,特別是一個(gè) struct 中字段非常多時(shí),一個(gè)個(gè)來(lái)回賦值確實(shí)有點(diǎn)費(fèi)手指。
但也要注意不要什么情況都使用,會(huì)帶來(lái)一些弊端:
- 當(dāng)刪除字段時(shí),不能利用編譯器提示。
- 當(dāng)一些字段需要額外人工處理時(shí),代碼不易閱讀。
- 反射賦值,有一定性能損耗。
總之在業(yè)務(wù)開(kāi)發(fā)時(shí),還是建議人工編寫(xiě),畢竟代碼是給人看的。
env
github.com/caarlos0/en… 這個(gè)庫(kù)可以將我們的環(huán)境變量轉(zhuǎn)換為一個(gè) 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) }
這個(gè)在我們打包代碼到不同的運(yùn)行環(huán)境時(shí)非常有用,利用它可以方便的獲取不同環(huán)境變量。
user_agent
github.com/mssola/user… 是一個(gè)格式化 user-agent
的小工具。
當(dāng)我們需要在服務(wù)端收集 user-agen
時(shí)可以更快的讀取數(shù)據(jù)。
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… 手機(jī)號(hào)碼驗(yàn)證庫(kù),可以不用自己寫(xiě)正則表達(dá)式了。
// parse our phone number num, err := phonenumbers.Parse("6502530000", "US")
基礎(chǔ)工具
接下來(lái)是一些基礎(chǔ)工具庫(kù),包含一些主流的存儲(chǔ)的客戶端、中間件等。
gomonkey
github.com/agiledragon… 是一個(gè) mock
打樁工具,當(dāng)我們寫(xiě)單元測(cè)試時(shí),需要對(duì)一些非接口函數(shù)進(jìn)行 mock
會(huì)比較困難,這時(shí)就需要用到它了。
由于它是修改了調(diào)用對(duì)應(yīng)函數(shù)時(shí)機(jī)器跳轉(zhuǎn)指令,而 CPU 架構(gòu)的不同對(duì)應(yīng)的指令也不同,所以在我們使用時(shí)還不兼容蘋(píng)果的 M1 芯片,不過(guò)目前應(yīng)該已經(jīng)兼容了,大家可以試試。
goconvey
github.com/smartystree… 也是配合單元測(cè)試的庫(kù),可以兼容 go test
命令。
- 提供可視化 web UI。
- 與 IDE 集成顯示單元覆蓋率。
dig
github.com/uber-go/dig 這是一個(gè)依賴(lài)注入庫(kù),我們這里暫不討論是否應(yīng)該使用依賴(lài)注入,至少目前我們使用下來(lái)還是有幾個(gè)好處:
- 所有的對(duì)象都是單例。
- 有一個(gè)統(tǒng)一的地方管理對(duì)象。
- 使用時(shí)直接傳遞對(duì)象當(dāng)做參數(shù)進(jìn)來(lái)即可(容器會(huì)自動(dòng)注入)。
當(dāng)然也有一些不太方便的地方:
- 不熟悉時(shí),一個(gè)對(duì)象是如何創(chuàng)建的不清楚。
- 代碼不是很好理解。
我們內(nèi)部有自己開(kāi)發(fā)一個(gè)業(yè)務(wù)框架,其中所有的對(duì)象都交由 dig 進(jìn)行管理,使用起來(lái)倒也是比較方便。
cobra
github.com/spf13/cobra是一個(gè)功能強(qiáng)大的命令行工具庫(kù),我們用它來(lái)實(shí)現(xiàn)內(nèi)部的命令行工具,同時(shí)也推薦使用 github.com/urfave/cli/ 我個(gè)人會(huì)更習(xí)慣用后者,要簡(jiǎn)潔一些。
BloomRPC
github.com/uw-labs/blo… 一個(gè) gRPC
可視化工具,比起自己寫(xiě) gRPC
客戶端的代碼那確實(shí)是要簡(jiǎn)單許多。
但也有些小問(wèn)題,比如精度。如果是 int64 超過(guò)了 2^56 服務(wù)端拿到的值會(huì)發(fā)生錯(cuò)誤,這點(diǎn)目前還未解決。
redis
github.com/go-redis/re… Redis 客戶端,沒(méi)有太多可說(shuō)的;發(fā)展了許多年,該有的的功能都有了。
elastic
github.com/olivere/ela… 這也是一個(gè)非常成熟的 elasticsearch
庫(kù)。
resty
github.com/go-resty/re… 一個(gè) http client, 使用起來(lái)非常簡(jiǎn)單:
// Create a Resty Client client := resty.New() resp, err := client.R(). EnableTrace(). Get("https://httpbin.org/get")
有點(diǎn) Python requests
包那味了。
pulsar-client-go
Pulsar 官方出品的 go 語(yǔ)言客戶端,相對(duì)于 Java 來(lái)說(shuō)其他語(yǔ)言的客戶端幾乎都是后娘養(yǎng)的;功能會(huì)比較少,同時(shí)更新也沒(méi)那么積極;但卻沒(méi)得選。
go-grpc-middleware
github.com/grpc-ecosys… 官方提供的 gRPC
中間件,可以自己實(shí)現(xiàn)內(nèi)部的一些鑒權(quán)、元數(shù)據(jù)、日志等功能。
go-pilosa
github.com/pilosa/go-p… 是一個(gè)位圖數(shù)據(jù)庫(kù)的客戶端,位圖數(shù)據(jù)庫(kù)的場(chǎng)景應(yīng)用比較有限,通常是有標(biāo)簽需求時(shí)才會(huì)用到;比如求 N 個(gè)標(biāo)簽的交并補(bǔ)集;數(shù)據(jù)有一定規(guī)模后運(yùn)營(yíng)一定會(huì)提相關(guān)需求;可以備著以備不時(shí)之需。
pb
github.com/cheggaaa/pb 一個(gè)命令行工具進(jìn)度條,編寫(xiě)命令行工具時(shí)使用它交互會(huì)更優(yōu)雅。
總結(jié)
最后匯總了一個(gè)表格,方便查看:
名稱(chēng) | 類(lèi)型 | 功能 | 星級(jí) |
---|---|---|---|
Gin | 業(yè)務(wù)開(kāi)發(fā) | HTTP 框架 | ?????????? |
GORM | 業(yè)務(wù)開(kāi)發(fā) | ORM 框架 | ?????????? |
errors | 業(yè)務(wù)開(kāi)發(fā) | 異常處理庫(kù) | ?????????? |
zorolog | 業(yè)務(wù)開(kāi)發(fā) | 日志庫(kù) | ?????????? |
excelize | 業(yè)務(wù)開(kāi)發(fā) | Excel 相關(guān)需求 | ?????????? |
now | 業(yè)務(wù)開(kāi)發(fā) | 時(shí)間處理 | ????????? |
Decimal | 業(yè)務(wù)開(kāi)發(fā) | 精度處理 | ????????? |
configor | 業(yè)務(wù)開(kāi)發(fā) | 配置文件 | ????????? |
go-cache | 業(yè)務(wù)開(kāi)發(fā) | 本地緩存 | ?????? |
copier | 業(yè)務(wù)開(kāi)發(fā) | 數(shù)據(jù)復(fù)制 | ???????? |
env | 業(yè)務(wù)開(kāi)發(fā) | 環(huán)境變量 | ???????? |
user_agent | 業(yè)務(wù)開(kāi)發(fā) | 讀取 user-agent | ???????? |
phonenumbers | 業(yè)務(wù)開(kāi)發(fā) | 手機(jī)號(hào)碼驗(yàn)證 | ???????? |
gomonkey | 基礎(chǔ)工具 | mock 工具 | ????????? |
goconvey | 基礎(chǔ)工具 | 單測(cè)覆蓋率 | ????????? |
dig | 基礎(chǔ)工具 | 依賴(lài)注入 | ????????? |
cobra | 基礎(chǔ)工具 | 命令行工具 | ??????? |
cli | 基礎(chǔ)工具 | 命令行工具 | ??????? |
BloomRPC | 基礎(chǔ)工具 | gRPC 調(diào)試客戶端 | ??????? |
redis | 基礎(chǔ)工具 | Redis 客戶端 | ??????? |
elastic | 基礎(chǔ)工具 | elasticsearch 客戶端 | ??????? |
resty | 基礎(chǔ)工具 | http 客戶端 | ??????? |
pulsar-client-go | 基礎(chǔ)工具 | Pulsar 客戶端 | ?????? |
go-grpc-middleware | 基礎(chǔ)工具 | gRPC 中間件 | ????? |
go-pilosa | 基礎(chǔ)工具 | pilosa 客戶端 | ?????? |
pb | 基礎(chǔ)工具 | 命令行工具進(jìn)度條 | ?????? |
更多關(guān)于Go日常開(kāi)發(fā)常用第三方庫(kù)和工具請(qǐng)點(diǎn)擊下面的相關(guān)鏈接
- Golang配置解析神器go?viper使用詳解
- golang配置管理神器Viper使用教程
- 實(shí)用的Go語(yǔ)言開(kāi)發(fā)工具及使用示例
- golang的基礎(chǔ)語(yǔ)法和常用開(kāi)發(fā)工具詳解
- MongoDB開(kāi)源數(shù)據(jù)庫(kù)開(kāi)發(fā)工具dbKoda
- Go依賴(lài)注入DI工具wire使用詳解(golang常用庫(kù)包)
- golang常用庫(kù)之pkg/errors包第三方錯(cuò)誤處理包案例詳解
- golang常用庫(kù)之操作數(shù)據(jù)庫(kù)的orm框架-gorm基本使用詳解
- go程序員日常開(kāi)發(fā)效率神器匯總
相關(guān)文章
Go整合captcha實(shí)現(xiàn)驗(yàn)證碼功能
最近在使用Go語(yǔ)言搞一個(gè)用戶登錄&注冊(cè)的功能,我們油然會(huì)產(chǎn)生一種增加驗(yàn)證碼的想法。后來(lái)在GitHub上找到了這個(gè)名叫captcha的插件,于是就利用文檔進(jìn)行了初步的學(xué)習(xí),并融入到自己的項(xiàng)目中,整個(gè)過(guò)程下來(lái)感覺(jué)這個(gè)插件的設(shè)計(jì)非常巧妙2023-03-03Go語(yǔ)言做爬蟲(chóng)狀態(tài)碼返回418的問(wèn)題解決
在使用Go語(yǔ)言做爬蟲(chóng)時(shí),使用http.Get(url)去獲取網(wǎng)頁(yè)內(nèi)容,狀態(tài)碼返回404,本文我們就詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2021-12-12golang 將[]byte轉(zhuǎn)成16進(jìn)制的實(shí)現(xiàn)
這篇文章主要介紹了golang 將[]byte轉(zhuǎn)成16進(jìn)制的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12Golang定時(shí)器Timer與Ticker的使用詳解
在 Go 里有很多種定時(shí)器的使用方法,像常規(guī)的 Timer、Ticker 對(duì)象,本文主要為大家介紹了Timer與Ticker的使用,感興趣的小伙伴可以了解一下2023-05-05