最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go日常開發(fā)常用第三方庫和工具介紹

 更新時間:2022年11月26日 16:04:59   作者:crossoverJie  
這篇文章主要介紹了Go日常開發(fā)常用第三方庫和工具介紹,主要有web開發(fā)、數據庫開發(fā)、Redis開發(fā)需要的朋友可以參考下

這里我主要將這些庫分為兩類:

  • 業(yè)務開發(fā)
  • 基礎工具開發(fā)

業(yè)務開發(fā)

首先是業(yè)務開發(fā),主要包含了 web、數據庫、Redis 等。

Gin

首先是 Gin,一款 HTTP 框架,使用簡單、性能優(yōu)秀、資料眾多;你還在猶豫選擇哪款框架時,那就選擇它吧,基本沒錯。

當然和它配套的 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 里的日志打印庫非常多,日志在日常開發(fā)中最好就是存在感低;也就是說性能強(不能影響到業(yè)務代碼)、使用 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 是一個時間工具庫:

  • 獲取當前的年月日、時分秒。
  • 不同時區(qū)支持。
  • 最后一周、最后一個月等。
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

當業(yè)務上需要精度計算時 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 中字段非常多時,一個個來回賦值確實有點費手指。

但也要注意不要什么情況都使用,會帶來一些弊端:

  • 當刪除字段時,不能利用編譯器提示。
  • 當一些字段需要額外人工處理時,代碼不易閱讀。
  • 反射賦值,有一定性能損耗。

總之在業(yè)務開發(fā)時,還是建議人工編寫,畢竟代碼是給人看的。

env

github.com/caarlos0/en… 這個庫可以將我們的環(huán)境變量轉換為一個 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)
}

這個在我們打包代碼到不同的運行環(huán)境時非常有用,利用它可以方便的獲取不同環(huán)境變量。

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 這是一個依賴注入庫,我們這里暫不討論是否應該使用依賴注入,至少目前我們使用下來還是有幾個好處:

  • 所有的對象都是單例。
  • 有一個統(tǒng)一的地方管理對象。
  • 使用時直接傳遞對象當做參數進來即可(容器會自動注入)。

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

  • 不熟悉時,一個對象是如何創(chuàng)建的不清楚。
  • 代碼不是很好理解。

我們內部有自己開發(fā)一個業(yè)務框架,其中所有的對象都交由 dig 進行管理,使用起來倒也是比較方便。

cobra

github.com/spf13/cobra是一個功能強大的命令行工具庫,我們用它來實現內部的命令行工具,同時也推薦使用 github.com/urfave/cli/ 我個人會更習慣用后者,要簡潔一些。

BloomRPC

github.com/uw-labs/blo… 一個 gRPC 可視化工具,比起自己寫 gRPC 客戶端的代碼那確實是要簡單許多。

但也有些小問題,比如精度。如果是 int64 超過了 2^56 服務端拿到的值會發(fā)生錯誤,這點目前還未解決。

redis

github.com/go-redis/re… Redis 客戶端,沒有太多可說的;發(fā)展了許多年,該有的的功能都有了。

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 來說其他語言的客戶端幾乎都是后娘養(yǎng)的;功能會比較少,同時更新也沒那么積極;但卻沒得選。

go-grpc-middleware

github.com/grpc-ecosys… 官方提供的 gRPC 中間件,可以自己實現內部的一些鑒權、元數據、日志等功能。

go-pilosa

github.com/pilosa/go-p… 是一個位圖數據庫的客戶端,位圖數據庫的場景應用比較有限,通常是有標簽需求時才會用到;比如求 N 個標簽的交并補集;數據有一定規(guī)模后運營一定會提相關需求;可以備著以備不時之需。

pb

github.com/cheggaaa/pb 一個命令行工具進度條,編寫命令行工具時使用它交互會更優(yōu)雅。

總結

最后匯總了一個表格,方便查看:

名稱類型功能星級
Gin業(yè)務開發(fā)HTTP 框架??????????
GORM業(yè)務開發(fā)ORM 框架??????????
errors業(yè)務開發(fā)異常處理庫??????????
zorolog業(yè)務開發(fā)日志庫??????????
excelize業(yè)務開發(fā)Excel相關需求??????????
now業(yè)務開發(fā)時間處理?????????
Decimal業(yè)務開發(fā)精度處理?????????
configor業(yè)務開發(fā)配置文件?????????
go-cache業(yè)務開發(fā)本地緩存??????
copier業(yè)務開發(fā)數據復制????????
env業(yè)務開發(fā)環(huán)境變量????????
user_agent業(yè)務開發(fā)讀取 user-agent????????
phonenumbers業(yè)務開發(fā)手機號碼驗證????????
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日常開發(fā)常用第三方庫和工具請點擊下面的相關鏈接

相關文章

  • golang之數據校驗的實現代碼示例

    golang之數據校驗的實現代碼示例

    這篇文章主要介紹了golang之數據校檢的實現代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • go語言異常panic和恢復recover用法實例

    go語言異常panic和恢復recover用法實例

    這篇文章主要介紹了go語言異常panic和恢復recover用法,實例分析了異常panic和恢復recover使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • Go批量操作excel導入到mongodb的技巧

    Go批量操作excel導入到mongodb的技巧

    這篇文章主要介紹了Go批量操作excel導入到mongo,包括選擇命令行包,讀取配置連接數據庫的方法,本文示例代碼相結合給大家介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • go程序執(zhí)行交叉編譯的流程步驟

    go程序執(zhí)行交叉編譯的流程步驟

    go程序可用通過交叉編譯的方式在一個平臺輸出多個平臺可運行的二進制包,本文給大家詳細介紹了go程序執(zhí)行交叉編譯的流程步驟,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • Golang工作池的使用實例講解

    Golang工作池的使用實例講解

    我們使用Go語言開發(fā)項目,常常會使用到goroutine;goroutine太多會造成系統(tǒng)占用過高或其他系統(tǒng)異常,我們可以將goroutine控制指定數量,且減少goroutine的創(chuàng)建,這就運用到Go工作池,下面就介紹和使用一下
    2023-02-02
  • golang?http請求未釋放造成的錯誤問題

    golang?http請求未釋放造成的錯誤問題

    這篇文章主要介紹了golang?http請求未釋放造成的錯誤問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Go字典使用詳解

    Go字典使用詳解

    今天和大家一起學習Go語言的字典。Go語言的字典又稱為map,一種使用廣泛的數據結構。它是擁有key/value對元素的「無序集合」,而且在集合中key必須是唯一的
    2022-11-11
  • golang中strconv.ParseInt函數用法示例

    golang中strconv.ParseInt函數用法示例

    這篇文章主要介紹了golang中strconv.ParseInt函數用法,實例分析了strconv.ParseInt函數將字符串轉換為數字的簡單使用方法,需要的朋友可以參考下
    2016-07-07
  • Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境圖文詳解

    Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境圖文詳解

    GoLand?是?JetBrains?公司推出的商業(yè)?Go?語言集成開發(fā)環(huán)境(IDE),這篇文章主要介紹了Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境詳解,需要的朋友可以參考下
    2022-10-10
  • Golang 標準庫 tips之waitgroup詳解

    Golang 標準庫 tips之waitgroup詳解

    本篇文章給大家介紹Golang 標準庫 tips之waitgroup的相關知識,包括使用 channel 實現 WaitGroup 的功能介紹,感興趣的朋友跟隨小編一起看看吧
    2021-07-07

最新評論

鲜城| 宁晋县| 潞城市| 吉水县| 舞钢市| 苏尼特左旗| 巴楚县| 滦南县| 唐河县| 佛坪县| 景德镇市| 特克斯县| 高雄县| 高州市| 伊川县| 正安县| 玛沁县| 商洛市| 义乌市| 壶关县| 柞水县| 连平县| 建阳市| 黄骅市| 唐海县| 兴业县| 汤阴县| 石楼县| 喜德县| 缙云县| 南投市| 婺源县| 牟定县| 鄂伦春自治旗| 勃利县| 搜索| 商丘市| 伊宁县| 启东市| 确山县| 白玉县|