您好,登錄后才能下訂單哦!
這篇文章主要介紹了Go日常開發常用第三方庫和工具有哪些的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Go日常開發常用第三方庫和工具有哪些文章都會有所收獲,下面我們一起來看看吧。
首先是業務開發,主要包含了 web
、數據庫、Redis
等。
首先是 Gin,一款 HTTP 框架,使用簡單、性能優秀、資料眾多;你還在猶豫選擇哪款框架時,那就選擇它吧,基本沒錯。
當然和它配套的 github.com/swaggo/gin-… swagger 工具也是剛需;利用它可以生成 swagger 文檔。
GORM 也沒啥好說的,如果你喜歡 orm
的方式操作數據庫,那就選它吧;同樣的也是使用簡單、資料較多。
如果有讀寫分離需求,也可以使用 GORM
官方提供的插件 github.com/go-gorm/dbr… ,配合 GORM
使用也是非常簡單。
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
Go 里的日志打印庫非常多,日志在日常開發中最好就是存在感低;也就是說性能強(不能影響到業務代碼)、使用 API 簡單。
"github.com/rs/zerolog/log" log.Debug().Msgf("OrderID :%s", "12121")
github.com/qax-os/exce…是一個讀寫 Excel 的庫,基本上你能遇到的 Excel 操作它都能實現。
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
當業務上需要精度計算時 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"`
github.com/jinzhu/conf… 是一個配置文件讀取庫,支持 YAML/JSON/TOML
等格式。
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)
github.com/jinzhu/copi… 看名字就知道這是一個數據復制的庫,與 Java
中的 BeanUtils.copy()
類似;可以將兩個字段相同但對象不同的 struct
進行數據復制,也支持深拷貝。
func Copy(toValue interface{}, fromValue interface{}) (err error)
在我們需要一個臨時 struct 來存放數據時很有用,特別是一個 struct 中字段非常多時,一個個來回賦值確實有點費手指。
但也要注意不要什么情況都使用,會帶來一些弊端:
當刪除字段時,不能利用編譯器提示。
當一些字段需要額外人工處理時,代碼不易閱讀。
反射賦值,有一定性能損耗。
總之在業務開發時,還是建議人工編寫,畢竟代碼是給人看的。
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) }
這個在我們打包代碼到不同的運行環境時非常有用,利用它可以方便的獲取不同環境變量。
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()) }
github.com/nyaruka/pho… 手機號碼驗證庫,可以不用自己寫正則表達式了。
// parse our phone number num, err := phonenumbers.Parse("6502530000", "US")
接下來是一些基礎工具庫,包含一些主流的存儲的客戶端、中間件等。
github.com/agiledragon… 是一個 mock
打樁工具,當我們寫單元測試時,需要對一些非接口函數進行 mock
會比較困難,這時就需要用到它了。
由于它是修改了調用對應函數時機器跳轉指令,而 CPU 架構的不同對應的指令也不同,所以在我們使用時還不兼容蘋果的 M1 芯片,不過目前應該已經兼容了,大家可以試試。
github.com/smartystree… 也是配合單元測試的庫,可以兼容 go test
命令。
提供可視化 web UI。
與 IDE 集成顯示單元覆蓋率。
github.com/uber-go/dig 這是一個依賴注入庫,我們這里暫不討論是否應該使用依賴注入,至少目前我們使用下來還是有幾個好處:
所有的對象都是單例。
有一個統一的地方管理對象。
使用時直接傳遞對象當做參數進來即可(容器會自動注入)。
當然也有一些不太方便的地方:
不熟悉時,一個對象是如何創建的不清楚。
代碼不是很好理解。
我們內部有自己開發一個業務框架,其中所有的對象都交由 dig 進行管理,使用起來倒也是比較方便。
github.com/spf13/cobra是一個功能強大的命令行工具庫,我們用它來實現內部的命令行工具,同時也推薦使用 github.com/urfave/cli/ 我個人會更習慣用后者,要簡潔一些。
github.com/uw-labs/blo… 一個 gRPC
可視化工具,比起自己寫 gRPC
客戶端的代碼那確實是要簡單許多。
但也有些小問題,比如精度。如果是 int64 超過了 2^56 服務端拿到的值會發生錯誤,這點目前還未解決。
github.com/go-redis/re… Redis 客戶端,沒有太多可說的;發展了許多年,該有的的功能都有了。
github.com/olivere/ela… 這也是一個非常成熟的 elasticsearch
庫。
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 官方出品的 go 語言客戶端,相對于 Java 來說其他語言的客戶端幾乎都是后娘養的;功能會比較少,同時更新也沒那么積極;但卻沒得選。
github.com/grpc-ecosys… 官方提供的 gRPC
中間件,可以自己實現內部的一些鑒權、元數據、日志等功能。
github.com/pilosa/go-p… 是一個位圖數據庫的客戶端,位圖數據庫的場景應用比較有限,通常是有標簽需求時才會用到;比如求 N 個標簽的交并補集;數據有一定規模后運營一定會提相關需求;可以備著以備不時之需。
github.com/cheggaaa/pb 一個命令行工具進度條,編寫命令行工具時使用它交互會更優雅。
關于“Go日常開發常用第三方庫和工具有哪些”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Go日常開發常用第三方庫和工具有哪些”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。