闲社服务运行正常AI智能体自动化平台
g

Golang函数工具库

技能标识: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

作者:admin | 来源记录:ClawHub
登记来源
ClawHub
版本
V 1.0.3
检测标记
后台标记通过
免费
免费获取
0
收藏
来源与检测标记为平台登记信息,并不代表已展示可复核的检测报告。使用前请核对版本、依赖和所需权限,建议先在隔离环境中运行。
概述
安装方式
版本历史

Golang函数工具库

技能名称: golang-samber-lo
详细描述:
角色: 你是一位Go工程师,更倾向于使用声明式集合转换而非手动循环。你会使用lo来消除样板代码,但你知道何时标准库已足够,以及何时应升级到lop、lom或loi。

samber/lo — Go语言的函数式工具库

受Lodash启发、以泛型为先的工具库,提供500多个类型安全的辅助函数,涵盖切片、映射、字符串、数学、通道、元组和并发。零外部依赖。默认不可变。

官方资源:

本技能并非详尽无遗。请参考库文档和代码示例获取更多信息。Context7可作为发现平台提供帮助。

为什么选择samber/lo

Go的标准库slices和maps包涵盖了约10个基本辅助函数(排序、包含、键)。其他所有功能——Map、Filter、Reduce、GroupBy、Chunk、Flatten、Zip——都需要手动编写for循环。lo填补了这一空白:

  • - 类型安全的泛型 — 无需interface{}类型转换,无反射,编译时检查,无接口装箱开销
  • 默认不可变 — 返回新集合,并发读取安全,更易于推理
  • 可组合 — 函数接收并返回切片/映射,因此无需包装器类型即可链式调用
  • 零依赖 — 仅依赖Go标准库,无传递性依赖风险
  • 渐进式复杂度 — 从lo开始,仅在性能分析要求时升级到lop/lom/loi
  • 错误变体 — 大多数函数带有Err后缀(MapErr、FilterErr、ReduceErr),在遇到第一个错误时停止

安装

bash
go get github.com/samber/lo

包导入路径别名Go版本
核心(不可变)github.com/samber/lolo1.18+
并行
github.com/samber/lo/parallel | lop | 1.18+ | | 可变 | github.com/samber/lo/mutable | lom | 1.18+ | | 迭代器 | github.com/samber/lo/it | loi | 1.23+ | | SIMD(实验性) | github.com/samber/lo/exp/simd | — | 1.25+(仅amd64) |

选择合适的包

从lo开始。仅在性能分析显示瓶颈或明确需要惰性求值时,才迁移到其他包。

包使用场景权衡
lo所有转换的默认选择分配新集合(安全、可预测)
lop
大数据集(1000+项)上的CPU密集型工作 | 协程开销;不适用于I/O或小切片 |
| lom | 经pprof -alloc_objects确认的热路径 | 修改输入——调用者必须理解副作用 |
| loi | 带有链式转换的大数据集(Go 1.23+) | 惰性求值节省内存,但增加了迭代器复杂度 |
| simd | 基准测试后的数值批量操作(实验性) | API不稳定,可能在版本间发生变化 |

关键规则:

  • - lop用于CPU并行,而非I/O并发——对于I/O扇出,请使用errgroup
  • lom破坏了不可变性——仅在测量到分配压力时使用,切勿假设
  • loi通过惰性求值消除了Map → Filter → Take等链式调用中的中间分配
  • 对于无限事件流上的响应式/流式管道,→ 参见samber/cc-skills-golang@golang-samber-ro技能 + samber/ro包

有关详细的包比较和决策流程图,请参见包指南。

核心模式

转换切片

go
// ✓ lo — 声明式,类型安全
names := lo.Map(users, func(u User, _ int) string {
return u.Name
})

// ✗ 手动 — 样板代码,易出错
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: [...]}

错误变体 — 在第一个错误处停止

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

常见错误

错误失败原因修复
在slices.Contains已存在时使用lo.Contains为标准库已覆盖的操作引入不必要的依赖自Go 1.21+起,优先使用slices.Contains、slices.Sort、maps.Keys
对10个项使用lop.Map
协程创建开销超过转换成本 | 使用lo.Map——lop的优势从约1000+项的CPU密集型工作开始体现 | | 假设lo.Filter会修改输入 | lo默认不可变——它返回一个新切片 | 如果明确需要原地修改,使用lom.Filter | | 在生产代码路径中使用lo.Must | Must在出错时会panic——在测试和初始化中没问题,在请求处理程序中很危险 | 使用非Must变体并处理错误 | | 在大数据上链式调用多个急切转换 | 每一步都会分配一个中间切片 | 使用loi(惰性迭代器)避免中间分配 |

最佳实践

  1. 1. 优先使用标准库(当可用时) — slices.Contains、slices.Sort、maps.Keys不引入依赖。对于标准库未提供的转换(Map、Filter、Reduce、GroupBy、Chunk、Flatten),使用lo
  2. 组合lo函数 — 链式调用lo.Filter → lo.Map → lo.GroupBy,而不是编写嵌套循环。每个函数都是一个构建块
  3. 先分析再优化 — 仅在go tool pprof确认分配或CPU是瓶颈后,再从lo切换到lom/lop
  4. 使用错误变体 — 优先使用lo.MapErr而非lo.Map + 手动错误收集。错误变体会提前停止并干净地传播
  5. 仅在测试和初始化中使用lo.Must — 在生产环境中,显式处理错误

快速参考

函数功能
lo.Map转换每个元素
lo.Filter / lo.Reject
保留/移除匹配谓词的元素 | | lo.Reduce | 将元素折叠为单个值 | | lo.ForEach | 副作用迭代 | | lo.GroupBy | 按键对元素分组 | | lo.Chunk | 分割成固定大小的批次 | | lo.Flatten | 将嵌套切片展平一层 | | lo.Uniq / lo.UniqBy | 移除重复项 | | lo.Find / lo.FindOrElse | 第一个匹配项或默认值 | | lo.Contains / lo.Every / lo.Some | 成员资格测试 | | lo.Keys / lo.Values | 提取映射的键或值 | | lo.PickBy / lo.OmitBy | 过滤映射条目 | | lo.Zip2 / lo.Unzip2 | 配对/解配对两个切片 | | lo.Range / lo.RangeFrom | 生成数字序列 | | lo.Ternary / lo.If | 内联条件判断 | | lo.ToPtr / lo.FromPtr | 指针辅助函数 | | lo.Must / lo.Try | 出错时panic / 将recover转为布尔值 | | lo.Async /

标签

skill ai

通过对话安装

以下为平台配置的接入选项,并非逐项实测通过。能否安装取决于客户端支持、技能来源和运行环境:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 golang-samber-lo-1776057796 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 golang-samber-lo-1776057796 技能

通过命令行安装

skillhub install golang-samber-lo-1776057796

下载

⬇ 下载 golang-samber-lo v1.0.3(免费)

文件大小: 19.38 KB | 发布时间: 2026-4-14 11:19

v1.0.3 最新 2026-4-14 11:19
- Version incremented to 1.0.3 and metadata updated accordingly.
- Compatibility note: Added AskUserQuestion to allowed tools.
- Minor text fix: "more informations" corrected to "more information" in documentation.
- No functional or feature changes; documentation only.
返回顶部