其他
用 samber/lo 在 Go…
当代码库使用或引入 github.com/samber/lo,或需要在 Go 中对切片、map、channel 做声明式转换(Map/Filter/Reduce/GroupBy/Chunk 等)时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 samber/lo 在 Go 中做函通用
解决思路
- 安装依赖:执行 `go get github.com/samber/lo`。
- 按需选择包:默认用 `lo`(不可变、安全);CPU 密集型大数据集(1000+ 项)用 `lop`(github.com/samber/lo/parallel);经 pprof 确认分配热点后用 `lom`(github.com/samber/lo/mutable,原地修改);Go 1.23+ 大数据链式转换用 `loi`(github.com/samber/lo/it,惰性迭代器);数值批量运算经基准测试后用实验性 `simd`(github.com/samber/lo/exp/simd,仅 amd64)。
- 用 `lo.Map` 转换切片元素,替代手写 make+append 循环。
- 用 `lo.Filter` + `lo.Reduce` 组合做过滤与聚合,例如先过滤已支付订单再累加金额。
- 用 `lo.GroupBy` 按 key 分组,返回 `map[string][]T`。
- 需要遇错即停时用错误变体(`lo.MapErr`、`lo.FilterErr`、`lo.ReduceErr`),而不是手动收集错误。
- 优先使用标准库已有能力:`slices.Contains`、`slices.Sort`(Go 1.21+)、`slices.Collect(maps.Keys(m))`(Go 1.23+),仅在标准库没有时用 `lo`(Map、Filter、Reduce、GroupBy、Chunk、Flatten)。
- 组合 `lo` 函数(如 `lo.Filter` → `lo.Map` → `lo.GroupBy`)替代嵌套循环。
- 先用 `go tool pprof` 确认瓶颈是分配或 CPU,再决定从 `lo` 切换到 `lom`/`lop`。
- 仅在测试和 init 中使用 `lo.Must`;生产代码路径使用非 Must 变体并显式处理错误。
- 大数据上避免链式多个 eager 转换,改用 `loi` 惰性迭代器消除中间切片分配。
- I/O 并发扇出用 `errgroup`,不要用 `lop`(`lop` 只适合 CPU 并行)。
- 需要无限事件流的响应式/流式管道时,改用 `samber/ro` 包(参见 golang-samber-ro 技能)。
- 查 Go 包文档、符号、版本、导入方与已知漏洞时优先用 `godig`(golang-pkg-go-dev 技能),Context7 作为兜底。
- 在自有代码中导航该库用法(定义、调用点、诊断)时用 `gopls`(golang-gopls 技能)。
适用边界 · 注意事项
- 不要用 `lop` 处理小切片(约 10 项)或 I/O 并发——goroutine 开销超过收益,I/O 扇出应使用 `errgroup`。
- 不要假设 `lo.Filter` 会修改输入——`lo` 默认不可变,需要原地修改时用 `lom.Filter`。
- 不要在未用 pprof 测量前就使用 `lom`(破坏不可变性)或 `lop`;也不要在生产请求处理路径中使用会 panic 的 `lo.Must`。