golang-samber-lo
samber/lo を使用した Go 向けのファンクショナルプログラミングヘルパースキルです。スライス・マップ・チャネル・文字列・数値演算・タプル・並行処理向けの型安全なジェネリック関数(Map、Filter、Reduce、GroupBy、Chunk、Flatten、Find、Uniq 等)を500種類以上提供し、イミュータブルなコアパッケージ(lo)、並行処理バリアント(lop)、インプレース変更(lom)、遅延イテレータ(loi)、実験的な SIMD(lo/exp/simd)もカバーします。コードベースが `github.com/samber/lo` をインポートしている場合や、Go でファンクショナルスタイルのデータ変換を実装する際に適用してください。
description の原文を見る
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/samber/lo, or when implementing functional-style data transformations in Go. Not for streaming pipelines (→ See golang-samber-ro skill).
SKILL.md 本文
ペルソナ: あなたは、手動ループよりも宣言的なコレクション変換を好む Go エンジニアです。ボイラープレートを削減するために lo を活用しますが、stdlib で十分な場合と、lop、lom、または loi へアップグレードする必要がある場合を理解しています。
samber/lo — Go のための関数型ユーティリティ
Lodash にインスパイアされた、ジェネリクス優先のユーティリティライブラリで、スライス、マップ、文字列、数学、チャネル、タプル、および並行処理用の 500 以上の型安全なヘルパーを提供します。外部依存はゼロ。デフォルトではイミュータブル。
公式リソース:
このスキルは網羅的ではありません。詳細については、ライブラリのドキュメントとコード例を参照してください。Context7 は発見可能性プラットフォームとしてお役に立ちます。
samber/lo を使う理由
Go の stdlib slices と maps パッケージは、基本的なヘルパー (sort、contains、keys) をカバーしているのみ (~10 個)。他のすべて — Map、Filter、Reduce、GroupBy、Chunk、Flatten、Zip — は手動の for ループを必要とします。lo はこのギャップを埋めます:
- 型安全なジェネリクス —
interface{}キャストなし、リフレクションなし、コンパイル時チェック、インターフェイスボックス化オーバーヘッドなし - デフォルトではイミュータブル — 新しいコレクションを返す、並行読み取りに対して安全、推論しやすい
- 合成可能 — 関数がスライス/マップを取り返すため、ラッパー型なしでチェーンできる
- ゼロ依存 — stdlib のみ、推移的な依存リスクなし
- 段階的な複雑さ —
loから始めて、プロファイリングが要求する場合のみlop/lom/loiにアップグレード - エラーバリアント — ほとんどの関数に
Err接尾辞 (MapErr、FilterErr、ReduceErr) があり、最初のエラーで停止
インストール
go get github.com/samber/lo
| パッケージ | インポート | エイリアス | Go バージョン |
|---|---|---|---|
| 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) |
適切なパッケージを選ぶ
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パッケージを参照
詳細なパッケージ比較と決定フローチャートについては、Package Guide を参照してください。
コアパターン
スライスを変換
// ✓ 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
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": [...]}
エラーバリアント — 最初のエラーで停止
results, err := lo.MapErr(urls, func(url string, _ int) (Response, error) {
return http.Get(url)
})
よくある間違い
| 間違い | なぜ失敗するか | 修正方法 |
|---|---|---|
slices.Contains が存在する場合に lo.Contains を使用 | stdlib がカバーしている操作に対して不要な依存 | Go 1.21+ 以降では slices.Contains、slices.Sort、maps.Keys を使用 |
10 項目で lop.Map を使用 | ゴルーチン作成オーバーヘッドが変換コストを超える | lo.Map を使用 — lop の利点は CPU バウンド作業で ~1000+ 項目から始まる |
lo.Filter が入力を変更すると想定 | lo はデフォルトではイミュータブル — 新しいスライスを返す | インプレース変異が明示的に必要な場合は lom.Filter を使用 |
本番コードパスで lo.Must を使用 | Must はエラー時にパニックする — テストと init では問題ないが、リクエストハンドラーでは危険 | Must 以外のバリアントを使用してエラーを処理 |
| 大規模データで多くの積極的な変換をチェーン | 各ステップが中間スライスを割り当てる | loi (遅延イテレータ) を使用して中間割り当てを回避 |
ベストプラクティス
- stdlib が利用可能な場合は prefer stdlib —
slices.Contains、slices.Sort、maps.Keysは依存関係を伴わない。stdlib が提供しない変換 (Map、Filter、Reduce、GroupBy、Chunk、Flatten) にloを使用 - lo 関数を合成 — ネストされたループを書く代わりに、
lo.Filter→lo.Map→lo.GroupByをチェーン。各関数はビルディングブロック - 最適化する前にプロファイル —
go tool pprofが割り当てまたは CPU をボトルネックとして確認した後のみ、loからlom/lopに切り替え - エラーバリアントを使用 —
lo.Map+ 手動エラー収集よりもlo.MapErrを使用。エラーバリアントは早期に停止し、きれいに伝播 lo.Mustはテストと init のみで使用 — 本番環境では、エラーを明示的に処理
クイックリファレンス
| 関数 | 何をするか |
|---|---|
lo.Map | 各要素を変換 |
lo.Filter / lo.Reject | 述語にマッチする要素を保持/削除 |
lo.Reduce | 要素を単一の値に折り畳む |
lo.ForEach | 副作用のイテレーション |
lo.GroupBy | キーでグループ化 |
lo.Chunk | 固定サイズのバッチに分割 |
lo.Flatten | ネストされたスライスを 1 レベル平坦化 |
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 | 2 つのスライスをペア/アンペア |
lo.Range / lo.RangeFrom | 数値シーケンスを生成 |
lo.Ternary / lo.If | インライン条件分岐 |
lo.ToPtr / lo.FromPtr | ポインタヘルパー |
lo.Must / lo.Try | エラー時パニック/ブール値として回復 |
lo.Async / lo.Attempt | 非同期実行/バックオフでリトライ |
lo.Debounce / lo.Throttle | レート制限 |
lo.ChannelDispatcher | 複数チャネルへのファンアウト |
完全な関数カタログ (300+ 関数) については、API Reference を参照してください。
合成パターン、stdlib 相互運用、およびイテレータパイプラインについては、Advanced Patterns を参照してください。
samber/lo でバグまたは予期しない動作が発生した場合は、github.com/samber/lo/issues で issue をオープンしてください。
クロスリファレンス
- →
samber/cc-skills-golang@golang-samber-roスキルで、無限イベントストリーム上のリアクティブ/ストリーミングパイプライン (samber/roパッケージ) を参照 - →
samber/cc-skills-golang@golang-samber-moスキルで、lo 変換と合成するモナド型 (Option、Result、Either) を参照 - →
samber/cc-skills-golang@golang-data-structuresスキルで、適切な基礎データ構造を選択する方法を参照 - →
samber/cc-skills-golang@golang-performanceスキルで、lom/lopに切り替える前のプロファイリング手法を参照
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- samber
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/samber/cc-skills-golang / ライセンス: MIT
関連スキル
hugging-face-trackio
Trackioを使用してMLトレーニング実験を追跡・可視化できます。トレーニング中のメトリクスログ記録(Python API)、トレーニング診断のアラート発火、ログされたメトリクスの取得・分析(CLI)が必要な場合に活用してください。リアルタイムダッシュボード表示、Webhookを使用したアラート、HF Space同期、自動化向けのJSON出力に対応しています。
btc-bottom-model
ビットコインのサイクルタイミングモデルで、加重スコアリングシステムを搭載しています。日次パルス(4指標、32ポイント)とウィークリー構造(9指標、68ポイント)の2カテゴリーにわたる13の指標を追跡し、0~100のマーケットヒートスコアを算出します。ETFフロー、ファンディングレート、ロング/ショート比率、恐怖・貪欲指数、LTH-MVRV、NUPL、SOPR(LTH+STH)、LTH供給率、移動平均倍率(365日MA、200週MA)、週次RSI、出来高トレンドに対応します。市場サイクル全体を通じて買いと売りの両方の推奨を提供します。ビットコインの底値拾い、BTCサイクルポジション、買い時・売り時、オンチェーン指標、MVRV、NUPL、SOPR、LTH動向、ETFの流出入、ファンディングレート、恐怖指数、ビットコインが過熱状態か、マイナーコスト、暗号資産市場のセンチメント、BTCのポジションサイジング、「今ビットコインを買うべきか」「BTCが天井をつけているか」「オンチェーン指標は何を示しているか」といった質問の際にこのスキルを活用します。
protein_solubility_optimization
タンパク質の溶解性最適化 - タンパク質の溶解性を最適化します。タンパク質の特性を計算し、溶解性と親水性を予測し、有効な変異を提案します。タンパク質配列の特性計算、タンパク質機能の予測、親水性計算、ゼロショット配列予測を含むタンパク質エンジニアリング業務に使用できます。3つのSCPサーバーから4つのツールを統合しています。
research-lookup
Parallel Chat APIまたはPerplexity sonar-pro-searchを使用して、最新の研究情報を検索できます。学術論文の検索にも対応しています。クエリは自動的に最適なバックエンドにルーティングされるため、論文の検索、研究データの収集、科学情報の検証に活用できます。
tree-formatting
ggtree(R)またはiTOL(ウェブ)を使用して、系統樹の可視化とフォーマットを行います。系統樹を図として描画する際、ツリーレイアウトの選択、分類学に基づく枝やラベルの色付け、クレードの折りたたみ、サポート値の表示、またはツリーへのオーバーレイ追加が必要な場合に使用してください。系統推定(protein-phylogenyスキルを使用)やドメイン注釈(今後の独立したスキル)には使用しないでください。
querying-indonesian-gov-data
インドネシア政府の50以上のAPIとデータソースに接続できます。BPJPH(ハラール認証)、BOM(食品安全)、OJK(金融適正性)、BPS(統計)、BMKG(気象・地震)、インドネシア中央銀行(為替レート)、IDX(株式)、CKAN公開データポータル、pasal.id(第三者法MCP)に対応しています。インドネシア政府データを活用したアプリ開発、.go.idウェブサイトのスクレイピング、ハラール認証の確認、企業の法的適正性の検証、金融機関ステータスの照会、またはインドネシアMCPサーバーへの接続時に使用できます。CSRF処理、CKAN API使用方法、IP制限回避など、すぐに実行可能なPythonパターンを含んでいます。