samber/lo 提供了豐富的函式用於運算元組和切片

技术颜良發表於2024-07-18

Go 語言的 Lodash 風格庫

原創 lo 源自開發者
源自開發者
專注於提供關於Go語言的實用教程、案例分析、最新趨勢,以及雲原生技術的深度解析和實踐經驗分享。
273篇原創內容

在 JavaScript 的世界裡,Lodash 是一個家喻戶曉的工具庫,它提供了豐富的函式,方便開發者運算元組、物件、字串等等。Lodash 極大地提高了 JavaScript 開發者的效率,也讓程式碼更加簡潔易讀。

在 Go 語言 1.18 版本之前,由於缺乏泛型,我們很難實現像 Lodash 這樣功能強大且型別安全的工具庫。然而,隨著 Go 1.18 泛型的引入,這一切都發生了改變。

samber/lo 就是一個基於 Go 1.18+ 泛型的 Lodash 風格工具庫,它提供了大量的實用函式,涵蓋了陣列、切片、對映、通道、字串等多種資料型別,為 Go 語言開發者帶來了極大的便利。

安裝

使用以下命令即可安裝 samber/lo

go get github.com/samber/lo@v1

samber/lo 庫遵循 SemVer 規範,v1 版本保證 API 的穩定性,不會引入破壞性變更。

使用示例

陣列和切片操作

samber/lo 提供了豐富的函式用於運算元組和切片,例如:

  • Filter:過濾陣列元素,返回滿足條件的元素組成的新的切片。
even := lo.Filter([]int{1, 2, 3, 4}, func(x int, index int) bool {
return x%2 == 0
})
// even: []int{2, 4}
  • Map:將一個切片轉換為另一個型別的切片,透過回撥函式對每個元素進行轉換。
stringSlice := lo.Map([]int64{1, 2, 3, 4}, func(x int64, index int) string {
return strconv.FormatInt(x, 10)
})
// stringSlice: []string{"1", "2", "3", "4"}
  • Reduce:將一個切片 reduce 為一個值,透過回撥函式累積計算結果。
sum := lo.Reduce([]int{1, 2, 3, 4}, func(agg int, item int, index int) int {
return agg + item
}, 0)
// sum: 10
  • Uniq:去除陣列中的重複元素,返回新的切片。
uniqValues := lo.Uniq([]int{1, 2, 2, 1})
// uniqValues: []int{1, 2}

對映操作

samber/lo 也提供了用於操作對映的函式,例如:

  • Keys:返回對映的所有鍵組成的切片。
keys := lo.Keys(map[string]int{"foo": 1, "bar": 2})
// keys: []string{"foo", "bar"}
  • Values:返回對映的所有值組成的切片。
values := lo.Values(map[string]int{"foo": 1, "bar": 2})
// values: []int{1, 2}
  • PickBy:根據條件過濾對映,返回滿足條件的鍵值對組成的新的對映。
filteredMap := lo.PickBy(map[string]int{"foo": 1, "bar": 2, "baz": 3}, func(key string, value int) bool {
return value%2 == 1
})
// filteredMap: map[string]int{"foo": 1, "baz": 3}

字串操作

samber/lo 還提供了一些字串操作函式,例如:

  • RandomString:生成指定長度的隨機字串。
randomStr := lo.RandomString(10, lo.LettersCharset)
// randomStr: "aBcDeFgHiJ" (example)
  • PascalCase:將字串轉換為 PascalCase 格式。
pascalCaseStr := lo.PascalCase("hello_world")
// pascalCaseStr: "HelloWorld"

錯誤處理

samber/lo 提供了一些函式幫助我們更方便地處理錯誤,例如:

  • Must:如果函式呼叫返回錯誤,則 panic。
parsedTime := lo.Must(time.Parse("2006-01-02", "2022-01-15"))
// parsedTime: 2022-01-15 00:00:00 +0000 UTC
  • Try:呼叫函式並捕獲 panic,返回是否成功執行。
success := lo.Try(func() error {
panic("error")
return nil
})
// success: false

併發支援

samber/lo 提供了 lop 子包,其中包含了專門為併發場景設計的函式,例如:

  • ForEach:併發地對切片中的每個元素執行回撥函式。
lop.ForEach([]string{"hello", "world"}, func(x string, index int) {
println(x)
})
// 輸出 "hello" 和 "world",順序可能不確定
  • Map:併發地對切片中的每個元素執行回撥函式,並將結果收集到新的切片中。
result := lop.Map([]int64{1, 2, 3, 4}, func(x int64, index int) string {
return strconv.FormatInt(x, 10)
})
// result: []string{"1", "2", "3", "4"}

效能

samber/lo 基於泛型實現,相比於使用反射的庫,效能有顯著提升。同時,它的效能也與手寫 for 迴圈相當。

總結

samber/lo 是一個非常實用的 Go 語言工具庫,它提供了類似 Lodash 的豐富功能,並利用泛型實現了型別安全和高效能。它可以幫助 Go 語言開發者更方便地操作各種資料型別,提高開發效率並使程式碼更加簡潔易讀。

文章精選

使用 Go 語言連線並操作 SQLite 資料庫

Go語言官方團隊推薦的依賴注入工具

替代zap,Go語言官方實現的結構化日誌包

Go語言常見錯誤 | 不使用function option模式

必看| Go語言專案結構最佳實踐

點選關注並掃碼新增進交流群領取「Go 語言」學習資料

圖片

Golang · 目錄
上一篇Bilibili 開源 Go 微服務框架 Kratos
閱讀原文
閱讀 1229

相關文章