Go 語言的 Lodash 風格庫
在 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 語言開發者更方便地操作各種數據類型,提高開發效率並使代碼更加簡潔易讀。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/uaLJ64aYlk9YrhoMPT0sqA