golang 每日一庫 samber-lo

samber/lo 是一個非常流行的 Go 語言庫,它提供了一些常用的函數式編程風格的工具函數,使得 Go 代碼更加簡潔、優雅。該庫的設計理念是減少代碼冗餘,簡化開發過程,尤其是在處理常見的數據結構和算法時。

lo 這個庫的名字來源於 "Lazily Optimized" 的縮寫,但它本身並不涉及延遲計算或優化策略。它的目標是提供一系列常見操作的簡便方法,尤其是集合類型(如切片、映射、通道等)的操作。

主要特點:

  1. 函數式編程風格

    lo 庫提供了很多類似於其他語言(如 JavaScript、Python)中的函數式編程方法,如 mapfilterreduceflattengroupBy 等操作。

  2. 簡化常見操作

    :對於切片、映射、數組等常見數據結構,提供了大量簡化版的常見操作,減少了手動編寫代碼的複雜性。

  3. 更少的樣板代碼

    :通過簡化常見操作,減少了重複樣板代碼,提升了代碼的可讀性。

  4. 與 Go 標準庫兼容

    lo 庫的方法是建立在 Go 標準庫數據結構的基礎上,避免了不必要的依賴。

安裝方法:

你可以通過 Go 的包管理工具安裝該庫:

go get github.com/samber/lo

常用操作:

  1. Map

    :將給定的函數應用到切片中的每個元素,並返回新的切片。

    slice := []int{1, 2, 3, 4}
    result := lo.Map(slice, func(v int, _ int) int {
        return v * v
    })
    fmt.Println(result)  // 輸出:[1, 4, 9, 16]
  2. Filter

    :對切片進行篩選,返回滿足條件的元素組成的新切片。

    slice := []int{1, 2, 3, 4, 5}
    result := lo.Filter(slice, func(v int, _ int) bool {
        return v%2 == 0
    })
    fmt.Println(result)  // 輸出:[2, 4]
  3. Reduce

    :對切片中的元素進行歸約,通常用於累加或者組合元素。

    slice := []int{1, 2, 3, 4}
    sum := lo.Reduce(slice, func(acc int, v int) int {
        return acc + v
    }, 0)
    fmt.Println(sum)  // 輸出:10
  4. Flatten

    :將嵌套的切片進行展平,轉換爲一維切片。

    slice := [][]int{
        {1, 2},
        {3, 4},
        {5, 6},
    }
    result := lo.Flatten(slice)
    fmt.Println(result)  // 輸出:[1 2 3 4 5 6]
  5. GroupBy

    :將切片中的元素按指定條件進行分組,返回一個映射。

    slice := []int{1, 2, 3, 4, 5, 6}
    result := lo.GroupBy(slice, func(v int) string {
        if v%2 == 0 {
            return "even"
        }
        return "odd"
    })
    fmt.Println(result)  // 輸出:map[even:[2 4 6] odd:[1 3 5]]
  6. Some

    :檢查切片中的任意元素是否滿足條件。

    slice := []int{1, 2, 3, 4, 5}
    result := lo.Some(slice, func(v int) bool {
        return v > 3
    })
    fmt.Println(result)  // 輸出:true
  7. All

    :檢查切片中的所有元素是否滿足條件。

    slice := []int{2, 4, 6, 8}
    result := lo.All(slice, func(v int) bool {
        return v%2 == 0
    })
    fmt.Println(result)  // 輸出:true
  8. Distinct

    :去除切片中的重複元素,返回去重後的新切片。

    slice := []int{1, 2, 2, 3, 4, 4, 5}
    result := lo.Distinct(slice)
    fmt.Println(result)  // 輸出:[1 2 3 4 5]
  9. Includes

    :檢查切片中是否包含某個元素。

    slice := []int{1, 2, 3, 4, 5}
    result := lo.Includes(slice, 3)
    fmt.Println(result)  // 輸出:true
  10. Zip

:將兩個切片 “壓縮” 成一個包含配對元素的切片。

```
a := []int{1, 2, 3}
b := []string{"a""b""c"}
result := lo.Zip(a, b)
fmt.Println(result)  // 輸出:[1 a 2 b 3 c]












```

簡單示例:

package main

import (
"fmt"
"github.com/samber/lo"
)

func main() {
// 示例:Map
 numbers := []int{1, 2, 3, 4}
 squared := lo.Map(numbers, func(v int, _ int) int {
return v * v
 })
 fmt.Println(squared) // 輸出:[1 4 9 16]

// 示例:Filter
 evens := lo.Filter(numbers, func(v int, _ int) bool {
return v%2 == 0
 })
 fmt.Println(evens) // 輸出:[2 4]

// 示例:Reduce
 sum := lo.Reduce(numbers, func(acc, v int) int {
return acc + v
 }, 0)
 fmt.Println(sum) // 輸出:10
}

其他操作

1. 查找元素

2. 映射操作

3. 字符串操作

4. 併發操作

samber/lo 提供了併發版本的函數,位於 github.com/samber/lo/parallel,用於在併發環境下執行集合操作。

5. 錯誤處理

6. 其他實用函數

優勢:

適用場景:

總結:

samber/lo 庫通過提供函數式編程工具,使得 Go 開發者能夠更加簡潔高效地處理數據集合。它適用於各種需要對切片、數組、映射等數據進行常見操作的場景,能顯著提升代碼的可讀性和開發效率。

相當好用的庫,一褲在手,天下我有!

標題:golang 每日一庫 samber/lo
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/02/24/1740358852849.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/XUj3-WuLB4csqa-uB3R-lA