Bibliothek lo für Go: Generische Hilfsfunktionen (Lodash für Go)
In der Go-Entwicklung entsteht oft der Bedarf nach praktischen Funktionen für die Arbeit mit Collections, wie sie aus anderen Sprachen bekannt sind (z.B. map, filter, reduce aus JavaScript oder Python). Die Go-Standardbibliothek bietet nur ein minimales Set an Werkzeugen, und das Schreiben von sich wiederholenden for-Schleifen für jede Operation wird schnell mühsam. Hier kommt die Bibliothek lo ins Spiel – ein leistungsstarkes Set generischer Hilfsfunktionen, inspiriert von der beliebten JavaScript-Bibliothek Lodash.
Die Bibliothek lo nutzt Generics (generische Typen), die seit Go 1.18+ verfügbar sind, um typsichere Funktionen für die Arbeit mit Slices, Maps, Channels und anderen Datenstrukturen bereitzustellen. Anstatt für jede Transformation for i := range slice { ... } zu schreiben, können Sie eine einzige Codezeile verwenden: lo.Map(slice, transformFunc). Das macht den Code lesbarer, prägnanter und weniger fehleranfällig.
Warum lo verwenden? Erstens sparen Sie Zeit: Sie müssen keinen Boilerplate-Code mehr schreiben. Zweitens erhöhen Sie die Zuverlässigkeit: Die Funktionen der Bibliothek sind gründlich getestet und decken viele Randfälle ab. Drittens sorgt es für Einheitlichkeit: Das gesamte Team verwendet dieselben Funktionen mit verständlichen Namen, was Code-Reviews vereinfacht. lo ist ein Must-have für jedes Go-Projekt, das intensiv mit Daten-Collections arbeitet.
Installation
Die Installation der Bibliothek lo erfolgt auf dem für Go üblichen Weg über go get. Stellen Sie sicher, dass Sie Go Version 1.18 oder höher installiert haben (da die Bibliothek Generics verwendet).
go get github.com/samber/lo@latest
Nach Ausführung dieses Befehls wird die Bibliothek zu Ihrer go.mod-Datei hinzugefügt. Sie können sie nun in Ihren Code importieren:
import "github.com/samber/lo"
Schnellstart
Lassen Sie uns ein einfaches Programm schreiben, das lo zum Filtern und Transformieren eines Integer-Slices verwendet.
package main
import (
"fmt"
"github.com/samber/lo"
)
func main() {
// Ursprünglicher Integer-Slice
numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
// Nur gerade Zahlen filtern
evenNumbers := lo.Filter(numbers, func(x int, _ int) bool {
return x%2 == 0
})
fmt.Println("Gerade Zahlen:", evenNumbers) // [2 4 6 8 10]
// Jede Zahl verdoppeln
doubled := lo.Map(evenNumbers, func(x int, _ int) int {
return x * 2
})
fmt.Println("Verdoppelte gerade Zahlen:", doubled) // [4 8 12 16 20]
// Alle Zahlen summieren
sum := lo.Sum(doubled)
fmt.Println("Summe:", sum) // 60
}
Wie Sie sehen, ist der Code viel deklarativer und lesbarer geworden. Wir haben das Schreiben von drei separaten for-Schleifen vermieden.
Wichtige Methoden und Funktionen
Nachfolgend finden Sie eine Liste der wichtigsten Funktionen der lo-Bibliothek mit Anwendungsbeispielen. Die meisten Funktionen akzeptieren einen Slice und eine Callback-Funktion.
1. lo.Filter
Signatur: func Filter[T any](collection []T, predicate func(item T, index int) bool) []T
Funktion: Erstellt einen neuen Slice, der nur die Elemente des ursprünglichen Slices enthält, für die die Prädikatfunktion true zurückgibt.
package main
import (
"fmt"
"github.com/samber/lo"
)
func main() {
names := []string{"Alice", "Bob", "Charlie", "David", "Eve"}
// Nur Namen länger als 3 Zeichen behalten
longNames := lo.Filter(names, func(name string, _ int) bool {
return len(name) > 3
})
fmt.Println(longNames) // [Alice Charlie David]
}
2. lo.Map
S