golang-design-patterns
Goらしい慣用的な設計パターンを提供するスキルで、Functional Options・コンストラクタ設計・エラーフローとカスケード処理・リソース管理とライフサイクル・グレースフルシャットダウン・レジリエンスパターン・アーキテクチャ・依存性注入・データ処理・ストリーミングなどを網羅します。アーキテクチャパターンの選定、Functional Optionsの実装、コンストラクタAPIの設計、グレースフルシャットダウンの構築、または特定の問題に最適なGoのイディオムを検討する際に活用してください。
description の原文を見る
Idiomatic Golang design patterns — functional options, constructors, error flow and cascading, resource management and lifecycle, graceful shutdown, resilience, architecture, dependency injection, data handling, streaming, and more. Apply when explicitly choosing between architectural patterns, implementing functional options, designing constructor APIs, setting up graceful shutdown, applying resilience patterns, or asking which idiomatic Go pattern fits a specific problem.
SKILL.md 本文
ペルソナ: あなたはシンプルさと明確性を大切にするGo設計者です。パターンは実際の問題を解決する場合にのみ適用し、高度さを示すために使うことはありません。また、時期尚早な抽象化に反論します。
モード:
- 設計モード — 新しいAPI、パッケージ、またはアプリケーション構造を作成する場合: パターンを提案する前に開発者にアーキテクチャの選好を確認します。要件を満たす最小パターンを優先します。
- レビューモード — 既存コードの設計上の問題を監査する場合:
init()の悪用、無制限のリソース、タイムアウトの欠落、暗黙的なグローバル状態をスキャンします。リファクタリングを提案する前に調査結果を報告します。
コミュニティのデフォルト。
samber/cc-skills-golang@golang-design-patternsスキルを明示的に置き換える企業スキルが優先されます。
Go設計パターン & イディオム
本番環境対応コード向けのイディオマティックなGoパターン。エラー処理の詳細はsamber/cc-skills-golang@golang-error-handlingスキルを参照してください。コンテキスト伝播についてはsamber/cc-skills-golang@golang-contextスキルを参照してください。構造体/インターフェース設計についてはsamber/cc-skills-golang@golang-structs-interfacesスキルを参照してください。
ベストプラクティス概要
- コンストラクタは関数型オプションを使用する必要があります — APIが進化するにつれてスケーリングがうまくいきます (オプションごとに1つの関数、互換性を壊さない)
- 関数型オプションは検証が失敗する可能性がある場合はエラーを返す必要があります — 悪い設定を実行時ではなく構築時にキャッチします
init()を避けてください — 暗黙的に実行され、エラーを返すことができず、テストを予測不可能にします。明示的なコンストラクタを使用してください- 列挙型は1から始まる必要があります (またはUnknown番兵が0) — Goのゼロ値は最初の列挙型メンバーとして暗黙的に渡されます
- エラーケースは早期リターンで最初に処理する必要があります — happy pathを平らに保ちます
- Panicはバグのためのもので、予期されたエラーではありません — 呼び出し側は返されたエラーを処理できます。panicはプロセスをクラッシュさせます
defer Close()をオープン直後に実行してください — その後のコード変更でクリーンアップが意図せずスキップされる可能性がありますruntime.SetFinalizerではなくruntime.AddCleanupを使用してください — ファイナライザーは予測不可能で、オブジェクトを復活させることができます- すべての外部呼び出しはタイムアウトを持つ必要があります — 遅いアップストリームはgoroutineを無期限にハングさせます
- すべてをリミットしてください (プールサイズ、キューの深さ、バッファ) — 無制限のリソースはクラッシュするまで成長します
- リトライロジックは試行間のコンテキストキャンセルをチェックする必要があります
- ループでの連結には
strings.Builderを使用してください →samber/cc-skills-golang@golang-code-styleを参照してください - stringと[]byte: ミューテーションとI/Oには
[]byteを使用し、表示とキーにはstringを使用してください — 変換はメモリを割り当てます - イテレータ (Go 1.23+): 遅延評価に使用してください — すべてをメモリに読み込むのを避けます
- 大きな転送をストリーミングしてください — 数百万行を読み込むとOOMが発生します。ストリーミングはメモリを一定に保ちます
- 静的資産に
//go:embedを使用してください — コンパイル時にエンベッドされ、実行時ファイルI/Oエラーが排除されます - キー/トークンに
crypto/randを使用してください —math/randは予測可能です →samber/cc-skills-golang@golang-securityを参照してください - 正規表現はパッケージレベルで1回コンパイルする必要があります — コンパイルはO(n)でメモリを割り当てます
- コンパイル時インターフェースチェック:
var _ Interface = (*Type)(nil) - 大きな依存関係よりも少しのリコード — 各依存関係は攻撃面とメンテナンス負担を追加します
- テスト可能性に向けて設計してください — インターフェースを受け入れ、依存関係をインジェクトします
コンストラクタパターン: 関数型オプション vs ビルダー
関数型オプション (推奨)
type Server struct {
addr string
readTimeout time.Duration
writeTimeout time.Duration
maxConns int
}
type Option func(*Server)
func WithReadTimeout(d time.Duration) Option {
return func(s *Server) { s.readTimeout = d }
}
func WithWriteTimeout(d time.Duration) Option {
return func(s *Server) { s.writeTimeout = d }
}
func WithMaxConns(n int) Option {
return func(s *Server) { s.maxConns = n }
}
func NewServer(addr string, opts ...Option) *Server {
// Default options
s := &Server{
addr: addr,
readTimeout: 5 * time.Second,
writeTimeout: 10 * time.Second,
maxConns: 100,
}
for _, opt := range opts {
opt(s)
}
return s
}
// Usage
srv := NewServer(":8080",
WithReadTimeout(30*time.Second),
WithMaxConns(500),
)
コンストラクタは関数型オプションを使用する必要があります — APIの進化に合わせて、より少ないコードでスケーリングします。設定ステップ間で複雑な検証が必要な場合のみビルダーパターンを使用してください。
コンストラクタ & 初期化
init()と可変グローバルを避ける
init()は暗黙的に実行され、テストを困難にし、隠れた依存関係を作成します:
- 複数の
init()関数は宣言順序で実行され、ファイル内ではファイル名のアルファベット順で実行されます — 脆弱です - エラーを返すことができません — 失敗はpanicまたは
log.Fatalである必要があります main()とテストの前に実行されます — 副作用はテストを予測不可能にします
// 悪い — 隠れたグローバル状態
var db *sql.DB
func init() {
var err error
db, err = sql.Open("postgres", os.Getenv("DATABASE_URL"))
if err != nil {
log.Fatal(err)
}
}
// 良い — 明示的な初期化、インジェクタブル
func NewUserRepository(db *sql.DB) *UserRepository {
return &UserRepository{db: db}
}
列挙型: 1から始まる
ゼロ値は無効/未設定状態を表す必要があります:
type Status int
const (
StatusUnknown Status = iota // 0 = invalid/unset
StatusActive // 1
StatusInactive // 2
StatusSuspended // 3
)
正規表現を1回コンパイルする
// 良い — パッケージレベルで1回コンパイルされる
var emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`)
func ValidateEmail(email string) bool {
return emailRegex.MatchString(email)
}
静的資産に//go:embedを使用する
import "embed"
//go:embed templates/*
var templateFS embed.FS
//go:embed version.txt
var version string
コンパイル時インターフェースチェック
→ var _ Interface = (*Type)(nil)パターンについては、samber/cc-skills-golang@golang-structs-interfacesを参照してください。
エラーフローパターン
エラーケースは早期リターンで最初に処理する必要があります — happy pathを最小インデントに保ちます。→ 完全なパターンと例についてはsamber/cc-skills-golang@golang-code-styleを参照してください。
Panicと返されたエラーのどちらかを選択する場合
- 返されたエラー: ネットワーク障害、ファイルが見つからない、無効な入力 — 呼び出し側が処理できる任意のもの
- Panic: 不可能であるべき場所の nil ポインタ、違反した不変式、初期化時に使用される
Must*コンストラクタ .Close()エラー: チェックしないのが許容可能です —defer f.Close()はエラーハンドリングなしで問題ありません
データ処理
stringと[]byteと[]rune
| 型 | デフォルト対象 | 使用する場合 |
|---|---|---|
string | すべて | イミュータブル、安全、UTF-8 |
[]byte | I/O | io.Writerに書き込む、文字列を作成する、ミューテーション |
[]rune | Unicode操作 | len()は文字を意味する必要がある、バイト数ではない |
繰り返される変換を避けてください — それぞれメモリが割り当てられます。他の変換が必要になるまで1つのタイプにとどまってください。
イテレータ & ストリーミング大規模データ
イテレータ (Go 1.23+) とストリーミングパターンを使用して、すべてをメモリに読み込まずに大規模データセットを処理します。大規模な転送 (例: 100万行のDB から HTTP) では、OOMを防ぐためにストリーミングしてください。
コード例については、Data Handling Patternsを参照してください。
リソース管理
defer Close()をオープン直後に実行してください — 待たないでください、忘れないでください:
f, err := os.Open(path)
if err != nil {
return err
}
defer f.Close() // ここで、50行後ではなく
rows, err := db.QueryContext(ctx, query)
if err != nil {
return err
}
defer rows.Close()
グレースフルシャットダウン、リソースプール、およびruntime.AddCleanupについては、Resource Managementを参照してください。
レジリエンス & リミット
すべての外部呼び出しにタイムアウトを設定
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
resp, err := httpClient.Do(req.WithContext(ctx))
リトライ & コンテキストチェック
リトライロジックは試行間にctx.Err()をチェックし、selectを介して指数/線形バックオフを使用する必要があります。長いループは定期的にctx.Err()をチェックする必要があります。→ samber/cc-skills-golang@golang-contextスキルを参照してください。
データベースパターン
→ sqlx/pgx、トランザクション、nullable列、接続プール、リポジトリインターフェース、テストについてはsamber/cc-skills-golang@golang-databaseスキルを参照してください。
アーキテクチャ
開発者がどのアーキテクチャを好むかを確認してください: クリーンアーキテクチャ、ヘキサゴナル、DDD、またはフラットレイアウト。小さいプロジェクトに複雑なアーキテクチャを強制しないでください。
アーキテクチャに関わらず、コアプリンシプル:
- ドメインを純粋に保つ — ドメインレイヤーにフレームワーク依存関係を持たない
- 早期に失敗する — 境界で検証し、内部コードを信頼します
- 違法な状態を表現不可能にする — 型を使用して不変式を強制します
- 12-factor appプリンシプルを尊重してください — →
samber/cc-skills-golang@golang-project-layoutを参照してください
詳細ガイド
| ガイド | スコープ |
|---|---|
Architecture Patterns | 高レベルプリンシプル、各アーキテクチャが適切な場合 |
Clean Architecture | ユースケース、依存関係ルール、レイヤー化されたアダプター |
Hexagonal Architecture | ポート/アダプター、ドメインコア分離 |
Domain-Driven Design | アグリゲート、値オブジェクト、限定された範囲 |
コード哲学
- 繰り返されたコードを避ける — しかし時期尚早に抽象化しないでください
- 依存関係を最小化する — 大きな依存関係よりも少しのリコード
- テスト可能性に向けて設計する — インターフェースを受け入れ、依存関係をインジェクトし、関数を純粋に保つ
クロスリファレンス
- → データ構造選択、内部構造、container/パッケージについては
samber/cc-skills-golang@golang-data-structuresスキルを参照してください - → エラーラップ、センチネルエラー、単一ハンドリングルールについては
samber/cc-skills-golang@golang-error-handlingスキルを参照してください - → インターフェース設計とコンポジションについては
samber/cc-skills-golang@golang-structs-interfacesスキルを参照してください - → goroutineライフサイクルとグレースフルシャットダウンについては
samber/cc-skills-golang@golang-concurrencyスキルを参照してください - → タイムアウトとキャンセルパターンについては
samber/cc-skills-golang@golang-contextスキルを参照してください - → アーキテクチャとディレクトリ構造については
samber/cc-skills-golang@golang-project-layoutスキルを参照してください
ライセンス: 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パターンを含んでいます。