
Golang Tool-Dependencies & Iteratoren
Performance ist kein Zufall, sondern das Resultat des richtigen Werkzeugs. Für datenintensive Schnittstellen und Hintergrundprozesse (wie unsere Immobilien-Importer) setzen wir konsequent auf Go (Golang). Die jüngsten Updates der Sprache haben zwei Features manifestiert, die unseren Entwicklungsalltag massiv vereinfachen.
1. Endlich sauber: Tool Dependencies in der go.mod
Lange Zeit war es mühsam, Build-Tools (wie golangci-lint oder stringer) versionssicher im Projekt zu verankern. Man brauchte eine Dummy-Datei (meist tools.go mit Build-Tags), damit go mod tidy die Abhängigkeiten nicht entfernte.
Seit der Einführung der Tool-Direktive macht Go Schluss mit diesem Workaround. Wir definieren Werkzeuge jetzt direkt in der go.mod:
// go.mod
module [github.com/cloudwebdevs/immo-sync](https://github.com/cloudwebdevs/immo-sync)
go 1.25.0
// Definierte Build-Tools direkt im Modul
tool golang.org/x/tools/cmd/stringer
tool [github.com/golangci/golangci-lint/cmd/golangci-lint](https://github.com/golangci/golangci-lint/cmd/golangci-lint)
require (
// normale dependencies...
)
Ausgeführt werden sie dann einfach über go tool stringer. Das macht unsere GitLab CI/CD Pipelines extrem robust, da jeder Entwickler und jeder Build-Runner exakt dieselbe Version des Linter verwendet, ohne globale Installationen vorauszusetzen.
2. Das iter Package im Produktions-Einsatz
Mit der Stabilisierung der Iteratoren (seq / seq2) wurde die Standardbibliothek (z.B. slices und maps) massiv darauf ausgerichtet.
Wenn wir große JSON-Feeds von Immobilien-Plattformen verarbeiten, müssen wir oft Filtern und Mappen. Statt jedes Mal neue Slices im Speicher zu allokieren (und den Garbage Collector zu stressen), nutzen wir jetzt lazily evaluierte Iteratoren:
import (
"fmt"
"slices"
)
// Pipeline ohne unnötige Speicher-Allokation
func processProperties(properties []Property) {
// Collect sammelt die Iteratoren erst am Ende wieder ein
activePremium := slices.Collect(
slices.Filter(func(p Property) bool {
return p.IsActive && p.IsPremium
}, slices.Values(properties)),
)
fmt.Printf("Verarbeite %d Premium-Objekte", len(activePremium))
}
Fazit
Go entwickelt sich exzellent weiter. Es macht die Sprache nicht unnötig kompliziert, sondern räumt genau die Stellen auf, die bei großen, industriellen Codebases im Weg standen.
