# Golang Samber Lo > Helpers funcionales para Go con samber/lo: 500+ funciones genéricas type-safe para slices, maps, canales, strings, math, tuplas y concurrencia. Fuente: https://skillsagentes.com/skills/samber/cc-skills-golang/golang-samber-lo Markdown: https://skillsagentes.com/skills/samber/cc-skills-golang/golang-samber-lo.md Repositorio: https://github.com/samber/cc-skills-golang Autor: samber Licencia: MIT Actualizado: el mes pasado Coste de contexto: 166 tok instalada, 2.5k tok al activarse, 14.6k tok con todos los archivos del bundle Bundle: 5 archivos, 57 KB Permisos que pide: read edit write glob grep bash(go:*) bash(golangci-lint:*) bash(git:*) mcp__context7__resolve-library-id mcp__context7__query-docs askuserquestion bash(godig:*) bash(gopls:*) lsp mcp__gopls__* ## Instalación Un skill son archivos markdown: los mismos archivos valen para cualquier agente y lo único que cambia es el directorio de destino, es decir la bandera `--agent`. Añade `-g` para instalarlo en todos los proyectos de la máquina. ```bash # Claude Code npx -y skills add samber/cc-skills-golang --skill golang-samber-lo --agent claude-code # Cursor npx -y skills add samber/cc-skills-golang --skill golang-samber-lo --agent cursor # Codex npx -y skills add samber/cc-skills-golang --skill golang-samber-lo --agent codex # Gemini CLI npx -y skills add samber/cc-skills-golang --skill golang-samber-lo --agent gemini # Windsurf npx -y skills add samber/cc-skills-golang --skill golang-samber-lo --agent windsurf # Cline npx -y skills add samber/cc-skills-golang --skill golang-samber-lo --agent cline ``` ## Qué hace - Guía el uso de samber/lo para transformaciones funcionales en Go: Map, Filter, Reduce, GroupBy, Chunk, Flatten, Uniq, Find, etc. - Ayuda a elegir entre lo (inmutable), lop (paralelo), lom (mutable) y loi (iteradores perezosos) según el caso de uso - Señala errores comunes como usar lop en pocos elementos o asumir inmutabilidad incorrecta - Recomienda usar variantes con Err (MapErr, FilterErr, ReduceErr) para manejo de errores ## Cuándo usarla - El código importa github.com/samber/lo - Se está adoptando o usando samber/lo - Se implementan transformaciones de datos de estilo funcional en Go ## Cuándo no - Para pipelines de streaming sobre eventos infinitos (usar el skill golang-samber-ro en su lugar) ## Qué la activa - "¿Cómo reemplazo este for loop con lo.Map en Go?" - "Necesito agrupar tareas por estado usando samber/lo" - "¿Cuándo debería usar lop en lugar de lo?" - "Ayúdame a usar lo.MapErr para manejar errores en peticiones HTTP" ## Antes de instalar - Requiere el binario go y el módulo github.com/samber/lo instalado (go get github.com/samber/lo). ## Archivos - SKILL.md — 10 KB - evals/evals.json — 19 KB - references/advanced-patterns.md — 4 KB - references/api-reference.md — 18 KB - references/package-guide.md — 6 KB ## SKILL.md Reproducido tal cual desde samber/cc-skills-golang bajo MIT. Esta sección es el documento original y está en inglés. **Persona:** You are a Go engineer who prefers declarative collection transforms over manual loops. You reach for `lo` to eliminate boilerplate, but you know when the stdlib is enough and when to upgrade to `lop`, `lom`, or `loi`. # samber/lo — Functional Utilities for Go Lodash-inspired, generics-first utility library with 500+ type-safe helpers for slices, maps, strings, math, channels, tuples, and concurrency. Zero external dependencies. Immutable by default. **Official Resources:** - [github.com/samber/lo](https://github.com/samber/lo) - [lo.samber.dev](https://lo.samber.dev) - [pkg.go.dev/github.com/samber/lo](https://pkg.go.dev/github.com/samber/lo) This skill is not exhaustive. Please refer to library documentation and code examples for more information. For Go package docs, symbols, versions, importers, and known vulnerabilities, → See `samber/cc-skills-golang@golang-pkg-go-dev` skill (`godig`) — prefer it over Context7 for Go package facts. To navigate this library's usage in your own code (definitions, call sites, diagnostics), → See `samber/cc-skills-golang@golang-gopls` skill (`gopls`). Context7 remains a fallback for docs not indexed on pkg.go.dev. ## Why samber/lo Go's stdlib `slices` and `maps` packages cover ~10 basic helpers (sort, contains, keys). Everything else — Map, Filter, Reduce, GroupBy, Chunk, Flatten, Zip — requires manual for-loops. `lo` fills this gap: - **Type-safe generics** — no `interface{}` casts, no reflection, compile-time checking, no interface boxing overhead - **Immutable by default** — returns new collections, safe for concurrent reads, easier to reason about - **Composable** — functions take and return slices/maps, so they chain without wrapper types - **Zero dependencies** — only Go stdlib, no transitive dependency risk - **Progressive complexity** — start with `lo`, upgrade to `lop`/`lom`/`loi` only when profiling demands it - **Error variants** — most functions have `Err` suffixes (`MapErr`, `FilterErr`, `ReduceErr`) that stop on first error ## Installation ```bash go get github.com/samber/lo ``` | Package | Import | Alias | Go version | | --- | --- | --- | --- | | Core (immutable) | `github.com/samber/lo` | `lo` | 1.18+ | | Parallel | `github.com/samber/lo/parallel` | `lop` | 1.18+ | | Mutable | `github.com/samber/lo/mutable` | `lom` | 1.18+ | | Iterator | `github.com/samber/lo/it` | `loi` | 1.23+ | | SIMD (experimental) | `github.com/samber/lo/exp/simd` | — | 1.25+ (amd64 only) | ## Choose the Right Package Start with `lo`. Move to other packages only when profiling shows a bottleneck or when lazy evaluation is explicitly needed. | Package | Use when | Trade-off | | --- | --- | --- | | `lo` | Default for all transforms | Allocates new collections (safe, predictable) | | `lop` | CPU-bound work on large datasets (1000+ items) | Goroutine overhead; not for I/O or small slices | | `lom` | Hot path confirmed by `pprof -alloc_objects` | Mutates input — caller must understand side effects | | `loi` | Large datasets with chained transforms (Go 1.23+) | Lazy evaluation saves memory but adds iterator complexity | | `simd` | Numeric bulk ops after benchmarking (experimental) | Unstable API, may break between versions | **Key rules:** - `lop` is for CPU parallelism, not I/O concurrency — for I/O fan-out, use `errgroup` instead - `lom` breaks immutability — only use when allocation pressure is measured, never assumed - `loi` eliminates intermediate allocations in chains like `Map → Filter → Take` by evaluating lazily - For reactive/streaming pipelines over infinite event streams, → see `samber/cc-skills-golang@golang-samber-ro` skill + `samber/ro` package For detailed package comparison and decision flowchart, see [Package Guide](./references/package-guide.md). ## Core Patterns ### Transform a slice ```go // ✓ lo — declarative, type-safe names := lo.Map(users, func(u User, _ int) string { return u.Name }) // ✗ Manual — boilerplate, error-prone names := make([]string, 0, len(users)) for _, u := range users { names = append(names, u.Name) } ``` ### Filter + Reduce ```go total := lo.Reduce( lo.Filter(orders, func(o Order, _ int) bool { return o.Status == "paid" }), func(sum float64, o Order, _ int) float64 { return sum + o.Amount }, 0, ) ``` ### GroupBy ```go byStatus := lo.GroupBy(tasks, func(t Task, _ int) string { return t.Status }) // map[string][]Task{"open": [...], "closed": [...]} ``` ### Error variant — stop on first error ```go results, err := lo.MapErr(urls, func(url string, _ int) (Response, error) { return http.Get(url) }) ``` ## Common Mistakes | Mistake | Why it fails | Fix | | --- | --- | --- | | Using `lo.Contains` when `slices.Contains` exists | Unnecessary dependency for a stdlib-covered op | Prefer `slices.Contains`/`slices.Sort` since Go 1.21+ and `slices.Collect(maps.Keys(m))` since Go 1.23+ when a key slice is needed | | Using `lop.Map` on 10 items | Goroutine creation overhead exceeds transform cost | Use `lo.Map` — `lop` benefits start at ~1000+ items for CPU-bound work | | Assuming `lo.Filter` modifies the input | `lo` is immutable by default — it returns a new slice | Use `lom.Filter` if you explicitly need in-place mutation | | Using `lo.Must` in production code paths | `Must` panics on error — fine in tests and init, dangerous in request handlers | Use the non-Must variant and handle the error | | Chaining many eager transforms on large data | Each step allocates an intermediate slice | Use `loi` (lazy iterators) to avoid intermediate allocations | ## Best Practices 1. **Prefer stdlib when available** — `slices.Contains` and `slices.Sort` (Go 1.21+) carry no dependency; `maps.Keys` is Go 1.23+ and returns an iterator, so use `slices.Collect(maps.Keys(m))` when you need a slice. Use `lo` for transforms the stdlib doesn't offer (Map, Filter, Reduce, GroupBy, Chunk, Flatten) 2. **Compose lo functions** — chain `lo.Filter` → `lo.Map` → `lo.GroupBy` instead of writing nested loops. Each function is a building block 3. **Profile before optimizing** — switch from `lo` to `lom`/`lop` only after `go tool pprof` confirms allocation or CPU as the bottleneck 4. **Use error variants** — prefer `lo.MapErr` over `lo.Map` + manual error collection. Error variants stop early and propagate cleanly 5. **Use `lo.Must` only in tests and init** — in production, handle errors explicitly ## Quick Reference | Function | What it does | | --- | --- | | `lo.Map` | Transform each element | | `lo.Filter` / `lo.Reject` | Keep / remove elements matching predicate | | `lo.Reduce` | Fold elements into a single value | | `lo.ForEach` | Side-effect iteration | | `lo.GroupBy` | Group elements by key | | `lo.Chunk` | Split into fixed-size batches | | `lo.Flatten` | Flatten nested slices one level | | `lo.Uniq` / `lo.UniqBy` | Remove duplicates | | `lo.Find` / `lo.FindOrElse` | First match or default | | `lo.Contains` / `lo.Every` / `lo.Some` | Membership tests | | `lo.Keys` / `lo.Values` | Extract map keys or values | | `lo.PickBy` / `lo.OmitBy` | Filter map entries | | `lo.Zip2` / `lo.Unzip2` | Pair/unpair two slices | | `lo.Range` / `lo.RangeFrom` | Generate number sequences | | `lo.Ternary` / `lo.If` | Inline conditionals | | `lo.ToPtr` / `lo.FromPtr` | Pointer helpers | | `lo.Must` / `lo.Try` | Panic-on-error / recover-as-bool | | `lo.Async` / `lo.Attempt` | Async execution / retry with backoff | | `lo.Debounce` / `lo.Throttle` | Rate limiting | | `lo.ChannelDispatcher` | Fan-out to multiple channels | For the complete function catalog (300+ functions), see [API Reference](./references/api-reference.md). For composition patterns, stdlib interop, and iterator pipelines, see [Advanced Patterns](./references/advanced-patterns.md). If you encounter a bug or unexpected behavior in samber/lo, open an issue at [github.com/samber/lo/issues](https://github.com/samber/lo/issues). ## Cross-References - → See `samber/cc-skills-golang@golang-samber-ro` skill for reactive/streaming pipelines over infinite event streams (`samber/ro` package) - → See `samber/cc-skills-golang@golang-samber-mo` skill for monadic types (Option, Result, Either) that compose with lo transforms - → See `samber/cc-skills-golang@golang-data-structures` skill for choosing the right underlying data structure - → See `samber/cc-skills-golang@golang-performance` skill for profiling methodology before switching to `lom`/`lop` ## Dónde encaja - Categoría: [Herramientas para desarrolladores](https://skillsagentes.com/categorias/herramientas-desarrollo.md) — Skills que cambian cómo tu agente escribe, revisa y despliega código. - Creador: [samber](https://skillsagentes.com/creators/samber.md) — 0 skills en el directorio - [Todas las skills](https://skillsagentes.com/skills.md) - [Ranking de instalaciones](https://skillsagentes.com/ranking.md) ## Otras skills del mismo repositorio - [Golang Lint](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-lint.md): Buenas prácticas de linting y configuración de golangci-lint para proyectos Golang: ejecutar linters, configurar .golangci.yml, suprimir avisos con nolint, interpretar salidas y elegir linters. - [Golang Benchmark](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-benchmark.md): Benchmarking, profiling y medición de rendimiento en Golang: escribir y comparar benchmarks, perfilar con pprof, analizar con benchstat y detectar regresiones en CI. - [Golang How To](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-how-to.md): Orquestador de skills de Golang, siempre activo en cualquier tarea de código, revisión, debug o setup: carga las skills más relevantes de samber/cc-skills-golang, a menudo varias a la vez. - [Golang Testing](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-testing.md): Tests de Golang listos para producción: table-driven, suites y mocks con testify, tests paralelos, fuzzing, fixtures, detección de fugas de goroutines con goleak, snapshot testing, cobertura, tests de integración. - [Golang Performance](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-performance.md): Patrones y metodología de optimización de rendimiento en Golang: si hay cuello de botella X, aplica el patrón Y, una vez que profiling o benchmarks ya lo identificaron. ## Skills relacionadas - [Golang Samber Hot](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-samber-hot.md): Caché en memoria en Golang con samber/hot: algoritmos de expulsión (LRU, LFU, TinyLFU, S3FIFO, ARC, TwoQueue, SIEVE, FIFO), TTL, loaders, sharding y métricas Prometheus. - [Golang Samber Mo](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-samber-mo.md): Tipos monádicos para Golang con samber/mo — Option, Result, Either, Future, IO, Task y State para valores nulos seguros, manejo de errores y composición funcional. - [Golang Samber Slog](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-samber-slog.md): Extensiones de logging estructurado para Go con paquetes samber/slog-****: pipelines multi-handler, sampling, formateo de atributos, middleware HTTP y enrutamiento a backends como Datadog, Sentry o Loki. - [Golang Spf13 Viper](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-spf13-viper.md): Librería de configuración en Go con spf13/viper: precedencia en capas (flag > env > archivo > KV > default), BindPFlag, AutomaticEnv, Unmarshal con mapstructure, Sub, WatchConfig y aislamiento en tests. - [Golang Structs Interfaces](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-structs-interfaces.md): Patrones de diseño de structs e interfaces en Golang: composición, embedding, aserciones de tipo, interfaces pequeñas, DI vía interfaces, tags de campo y receptores puntero vs valor. --- Skills Agentes · [Índice de páginas en markdown](https://skillsagentes.com/sitemap.md) · [Inicio](https://skillsagentes.com/index.md)