Source profileQuality 90/100Review permissions

samber/cc-skills-golang/skills/golang-samber-lo/SKILL.md

golang-samber-lo

Functional programming helpers for Golang using samber/lo — 500+ type-safe generic functions for slices, maps, channels, strings, math, tuples, and concurrency (Map, Filter, Reduce, GroupBy, Chunk, Flatten, Find, Uniq, etc.). Core immutable package (lo), concurrent variants (lo/parallel aka lop), in-place mutations (lo/mutable aka lom), lazy iterators (lo/it aka loi for Go 1.23+), and experimental SIMD (lo/exp/simd). Apply when using or adopting samber/lo, when the codebase imports github.com/sa

Source repository stars
3,074
Declared platforms
2
Static risk flags
1
Last source update
2026-08-23
Source checked
2026-08-26

Decision brief

What it does: where it fits

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.

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexDeclaredSource recordInstall path and trigger
    Claude CodeDeclaredSource recordInstall path and trigger
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/samber/cc-skills-golang --skill "skills/golang-samber-lo"
    Safe inspection promptEditorial

    Inspect the Agent Skill "golang-samber-lo" from https://github.com/samber/cc-skills-golang/blob/a18860b303ef1d3d928f9670631e03210b8698bf/skills/golang-samber-lo/SKILL.md at commit a18860b303ef1d3d928f9670631e03210b8698bf. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      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 overheadImmutable by default — returns new collections, safe for concurrent reads, easier to reason aboutComposable — functions take and return slices/maps, so they chain without wrapper types
    2. 02

      Installation

      Review the “Installation” section in the pinned source before continuing.

      Review and apply the “Installation” source section.
    3. 03

      Choose the Right Package

      Start with lo. Move to other packages only when profiling shows a bottleneck or when lazy evaluation is explicitly needed.

      lop is for CPU parallelism, not I/O concurrency — for I/O fan-out, use errgroup insteadlom breaks immutability — only use when allocation pressure is measured, never assumedloi eliminates intermediate allocations in chains like Map → Filter → Take by evaluating lazily
    4. 04

      Core Patterns

      Review the “Core Patterns” section in the pinned source before continuing.

      Review and apply the “Core Patterns” source section.
    5. 05

      Transform a slice

      Review the “Transform a slice” section in the pinned source before continuing.

      Review and apply the “Transform a slice” source section.

    Permission review

    Static risk signals and limitations

    Runs scripts

    medium · line 29

    The documentation asks the agent to run terminal commands or scripts.

    go get github.com/samber/lo

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score90/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars3,074SourceRepository attention, not individual Skill quality
    Compatibility2 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    samber/cc-skills-golang
    Skill path
    skills/golang-samber-lo/SKILL.md
    Commit
    a18860b303ef1d3d928f9670631e03210b8698bf
    License
    MIT
    Collected
    2026-08-26
    Default branch
    main
    View the original SKILL.md

    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:

    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

    go get github.com/samber/lo
    
    PackageImportAliasGo version
    Core (immutable)github.com/samber/lolo1.18+
    Parallelgithub.com/samber/lo/parallellop1.18+
    Mutablegithub.com/samber/lo/mutablelom1.18+
    Iteratorgithub.com/samber/lo/itloi1.23+
    SIMD (experimental)github.com/samber/lo/exp/simd1.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.

    PackageUse whenTrade-off
    loDefault for all transformsAllocates new collections (safe, predictable)
    lopCPU-bound work on large datasets (1000+ items)Goroutine overhead; not for I/O or small slices
    lomHot path confirmed by pprof -alloc_objectsMutates input — caller must understand side effects
    loiLarge datasets with chained transforms (Go 1.23+)Lazy evaluation saves memory but adds iterator complexity
    simdNumeric 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.

    Core Patterns

    Transform a slice

    // ✓ 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

    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

    byStatus := lo.GroupBy(tasks, func(t Task, _ int) string {
        return t.Status
    })
    // map[string][]Task{"open": [...], "closed": [...]}
    

    Error variant — stop on first error

    results, err := lo.MapErr(urls, func(url string, _ int) (Response, error) {
        return http.Get(url)
    })
    

    Common Mistakes

    MistakeWhy it failsFix
    Using lo.Contains when slices.Contains existsUnnecessary dependency for a stdlib-covered opPrefer 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 itemsGoroutine creation overhead exceeds transform costUse lo.Maplop benefits start at ~1000+ items for CPU-bound work
    Assuming lo.Filter modifies the inputlo is immutable by default — it returns a new sliceUse lom.Filter if you explicitly need in-place mutation
    Using lo.Must in production code pathsMust panics on error — fine in tests and init, dangerous in request handlersUse the non-Must variant and handle the error
    Chaining many eager transforms on large dataEach step allocates an intermediate sliceUse loi (lazy iterators) to avoid intermediate allocations

    Best Practices

    1. Prefer stdlib when availableslices.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.Filterlo.Maplo.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

    FunctionWhat it does
    lo.MapTransform each element
    lo.Filter / lo.RejectKeep / remove elements matching predicate
    lo.ReduceFold elements into a single value
    lo.ForEachSide-effect iteration
    lo.GroupByGroup elements by key
    lo.ChunkSplit into fixed-size batches
    lo.FlattenFlatten nested slices one level
    lo.Uniq / lo.UniqByRemove duplicates
    lo.Find / lo.FindOrElseFirst match or default
    lo.Contains / lo.Every / lo.SomeMembership tests
    lo.Keys / lo.ValuesExtract map keys or values
    lo.PickBy / lo.OmitByFilter map entries
    lo.Zip2 / lo.Unzip2Pair/unpair two slices
    lo.Range / lo.RangeFromGenerate number sequences
    lo.Ternary / lo.IfInline conditionals
    lo.ToPtr / lo.FromPtrPointer helpers
    lo.Must / lo.TryPanic-on-error / recover-as-bool
    lo.Async / lo.AttemptAsync execution / retry with backoff
    lo.Debounce / lo.ThrottleRate limiting
    lo.ChannelDispatcherFan-out to multiple channels

    For the complete function catalog (300+ functions), see API Reference.

    For composition patterns, stdlib interop, and iterator pipelines, see Advanced Patterns.

    If you encounter a bug or unexpected behavior in samber/lo, open an issue at 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

    Frequently asked questions

    What to verify before installation and use

    What does the golang-samber-lo source document cover?

    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.

    How do I install golang-samber-lo?

    The source record exposes this install command: npx skills add https://github.com/samber/cc-skills-golang --skill "skills/golang-samber-lo". Inspect the command and pinned source before running it.

    Which Agent platforms does the source record declare?

    The pinned source record declares support for: codex, claude code.

    Which permission-related actions were detected?

    Static rules flagged exec-script in the source; the page lists the matching lines and excerpts.

    Alternatives

    Compare before choosing