golang-samber-do
`samber/do` を使用した Go の依存性注入を実装します。依存性注入の導入、サービスコンテナのセットアップ、サービスのライフサイクル管理、または `github.com/samber/do/v2` を使用したコードを扱う際に適用してください。手動の依存性注入のリファクタリング、ヘルスチェックの実装、グレースフルシャットダウン、スコープ/モジュールへのサービス整理にも活用できます。
description の原文を見る
Implements dependency injection in Golang using samber/do. Apply this skill when working with dependency injection, setting up service containers, managing service lifecycles, or when you see code using github.com/samber/do/v2. Also use when refactoring manual dependency injection, implementing health checks, graceful shutdown, or organizing services into scopes/modules.
SKILL.md 本文
Persona: あなたは依存性注入を設定する Go アーキテクトです。コンテナを構成ルートに保ち、具象型ではなくインターフェースに依存し、プロバイダーエラーを第一級の失敗として扱います。
Go での samber/do による依存性注入
Go 1.18+ ジェネリクスに基づく型安全な依存性注入ツールキット。
公式リソース:
このスキルはすべてをカバーしていません。詳細についてはライブラリドキュメントとコード例を参照してください。Context7 は検出可能性プラットフォームとして役立ちます。
このライブラリの v1 を使用しないでください。代わりに v2 をインストールしてください:
go get -u github.com/samber/do/v2
コアコンセプト
Injector (コンテナ)
import "github.com/samber/do/v2"
injector := do.New()
サービスタイプ
- Lazy (デフォルト): 最初にリクエストされたときに作成
- Eager: コンテナ開始時に即座に作成
- Transient: リクエストのたびに新しいインスタンスを作成
- Value: 事前作成された値、インスタンス化なし
プロバイダー関数
サービスはプロバイダー関数経由で登録する必要があります:
type Provider[T any] func(i Injector) (T, error)
基本的な使用方法
1. サービスの定義と登録
「インターフェースを受け取り、構造体を返す」に従う:
// サービスを登録 (デフォルトは遅延)
do.Provide(injector, func(i do.Injector) (Database, error) {
return &PostgreSQLDatabase{connString: "postgres://..."}, nil
})
// 事前作成された値を登録
do.ProvideValue(injector, &Config{Port: 8080})
// トランジェントサービスを登録 (毎回新しいインスタンス)
do.ProvideTransient(injector, func(i do.Injector) (*Logger, error) {
return &Logger{}, nil
})
// Eager サービスを登録 (即座に作成)
do.Provide(injector, do.Eager(&Config{Port: 8080}))
2. サービスの呼び出し
コンテナは構成ルートでのみアクセスする必要があります:
// エラーハンドリング付きで呼び出し
db, err := do.Invoke[Database](injector)
// MustInvoke はエラー時にパニック (サービスが存在することが確実な場合に使用)
db := do.MustInvoke[Database](injector)
3. サービスの依存関係
func NewUserService(i do.Injector) (UserService, error) {
db := do.MustInvoke[Database](i)
cache := do.MustInvoke[Cache](i)
return &userService{db: db, cache: cache}, nil
}
do.Provide(injector, NewUserService)
4. 暗黙的エイリアシング (推奨)
具象型を登録し、明示的なエイリアシングなしでインターフェースとして呼び出す:
// 具象型を登録
do.Provide(injector, func(i do.Injector) (*PostgreSQLDatabase, error) {
return &PostgreSQLDatabase{}, nil
})
// インターフェースとして直接呼び出す (暗黙的エイリアシング)
db := do.MustInvokeAs[Database](injector)
5. 名前付きサービス
同じ型の複数のサービスを登録:
do.ProvideNamed(injector, "primary-db", func(i do.Injector) (*Database, error) {
return &Database{URL: "postgres://primary..."}, nil
})
mainDB := do.MustInvokeNamed[*Database](injector, "primary-db")
パッケージ構成
do.Package() を使ってモジュール別にサービス登録を整理:
// infrastructure/package.go
var Package = do.Package(
do.Lazy(func(i do.Injector) (*postgres.DB, error) {
cfg := do.MustInvoke[*Config](i)
return postgres.Connect(cfg.DatabaseURL)
}),
do.Lazy(func(i do.Injector) (*redis.Client, error) {
cfg := do.MustInvoke[*Config](i)
return redis.NewClient(cfg.RedisURL), nil
}),
)
// main.go
injector := do.New(infrastructure.Package, service.Package)
完全なアプリケーション設定
func main() {
injector := do.New(
infrastructure.Package,
repository.Package,
service.Package,
transport.Package,
)
server := do.MustInvoke[*http.Server](injector)
go server.ListenAndServe()
_ = injector.ShutdownOnSignalsWithContext(context.Background(), os.Interrupt)
}
ベストプラクティス
- 具象型ではなくインターフェースに依存する — テストで本番コードに触れることなく実装を入れ替えられます
- 各サービスは 1 つの役目を持つ — 複数の責務を持つサービスはテストが難しく、置き換えも困難です
- 依存関係の木を浅く保つ — 3-4 レベルを超える連鎖は初期化順序を不安定にし、エラー追跡を困難にします
- プロバイダー関数でエラーを処理する — サイレントに失敗するプロバイダーは壊れたサービスを作成し、予期しない場所でクラッシュします
- スコープを使ってライフサイクル別にサービスを整理する — リクエストスコープサービスはリークを防ぎ、グローバルサービスは冗長な初期化を防ぎます
スコープ、ライフサイクル管理、構造体インジェクション、デバッグについては Advanced Usage を参照してください。
テストパターン (クローン、オーバーライド、モック) については Testing を参照してください。
クイックリファレンス
登録
| 関数 | 目的 |
|---|---|
do.Provide[T]() | 遅延サービスを登録 (デフォルト) |
do.ProvideNamed[T]() | 名前付き遅延サービスを登録 |
do.ProvideValue[T]() | 事前作成値を登録 |
do.ProvideNamedValue[T]() | 名前付き値を登録 |
do.ProvideTransient[T]() | 毎回新しいインスタンスを登録 |
do.ProvideNamedTransient[T]() | 名前付きトランジェントを登録 |
do.Package() | サービス登録をグループ化 |
呼び出し
| 関数 | 目的 |
|---|---|
do.Invoke[T]() | サービスを取得 (エラー付き) |
do.InvokeNamed[T]() | 名前付きサービスを取得 |
do.InvokeAs[T]() | インターフェースに一致する最初のサービスを取得 |
do.InvokeStruct[T]() | タグを使ってサービスを構造体フィールドに注入 |
do.MustInvoke[T]() | サービスを取得 (エラーでパニック) |
do.MustInvokeNamed[T]() | 名前付きサービスを取得 (エラーでパニック) |
do.MustInvokeAs[T]() | インターフェースでサービスを取得 (エラーでパニック) |
do.MustInvokeStruct[T]() | サービスを構造体に注入 (エラーでパニック) |
クロスリファレンス
- → DI コンセプト、比較、DI ライブラリを採用するタイミングについては
samber/cc-skills-golang@golang-dependency-injectionスキルを参照してください - → インターフェース設計パターンについては
samber/cc-skills-golang@golang-structs-interfacesスキルを参照してください - → 一般的なテストパターンについては
samber/cc-skills-golang@golang-testingスキルを参照してください
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- samber
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/samber/cc-skills-golang / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。