go-functional-options
Goのコンストラクタやファクトリ関数でオプション設定を柔軟に扱いたい場合、特に3つ以上のオプションパラメータや拡張性が必要なAPIを設計する際に使用します。"functional options"という名前を明示しなくても、多くの設定を受け取る`New*`関数の実装時にも適用されます。一般的な関数設計は対象外です(go-functionsを参照)。
description の原文を見る
Use when designing a Go constructor or factory function with optional configuration — especially with 3+ optional parameters or extensible APIs. Also use when building a New* function that takes many settings, even if they don't mention "functional options" by name. Does not cover general function design (see go-functions).
SKILL.md 本文
Functional Options パターン
Functional options は、不透明な Option 型を宣言し、内部構造体に情報を記録するパターンです。コンストラクタは可変長個数のこれらのオプションを受け取り、結果を設定するために適用します。
使用する時機
以下の場合に functional options を使用してください:
- 3 個以上のオプション引数 がコンストラクタまたは公開 API にある
- 拡張可能な API が時間とともに新しいオプションを得る可能性がある
- 呼び出し側のエクスペリエンス が重要 (デフォルト値を渡す必要がない)
パターン
コア コンポーネント
- エクスポートされていない
options構造体 - すべての設定を保持 - エクスポートされた
Optionインターフェース - エクスポートされていないapplyメソッド付き - Option 型 - インターフェースを実装
With*コンストラクタ - オプションを作成
Option インターフェース
type Option interface {
apply(*options)
}
エクスポートされていない apply メソッドは、このパッケージからのオプションのみが使用できることを保証します。
完全な実装
package db
import "go.uber.org/zap"
// options holds all configuration for opening a connection.
type options struct {
cache bool
logger *zap.Logger
}
// Option configures how we open the connection.
type Option interface {
apply(*options)
}
// cacheOption implements Option for cache setting (simple type alias).
type cacheOption bool
func (c cacheOption) apply(opts *options) {
opts.cache = bool(c)
}
// WithCache enables or disables caching.
func WithCache(c bool) Option {
return cacheOption(c)
}
// loggerOption implements Option for logger setting (struct for pointers).
type loggerOption struct {
Log *zap.Logger
}
func (l loggerOption) apply(opts *options) {
opts.logger = l.Log
}
// WithLogger sets the logger for the connection.
func WithLogger(log *zap.Logger) Option {
return loggerOption{Log: log}
}
// Open creates a connection.
func Open(addr string, opts ...Option) (*Connection, error) {
// Start with defaults
options := options{
cache: defaultCache,
logger: zap.NewNop(),
}
// Apply all provided options
for _, o := range opts {
o.apply(&options)
}
// Use options.cache and options.logger...
return &Connection{}, nil
}
使用例
Functional Options なし (悪い例)
// 呼び出し側は常にすべてのパラメータを提供する必要があり、デフォルト値も含まれます
db.Open(addr, db.DefaultCache, zap.NewNop())
db.Open(addr, db.DefaultCache, log)
db.Open(addr, false /* cache */, zap.NewNop())
db.Open(addr, false /* cache */, log)
Functional Options 付き (良い例)
// 必要な場合のみオプションを指定
db.Open(addr)
db.Open(addr, db.WithLogger(log))
db.Open(addr, db.WithCache(false))
db.Open(
addr,
db.WithCache(false),
db.WithLogger(log),
)
比較: Functional Options と設定構造体
| 側面 | Functional Options | 設定構造体 |
|---|---|---|
| 拡張性 | 新しい With* 関数を追加 | 新しいフィールドを追加 (破壊的変更の可能性) |
| デフォルト値 | コンストラクタに組み込み | ゼロ値または別のデフォルト値 |
| 呼び出し側のエクスペリエンス | 異なる部分のみを指定 | 構造体全体を構築する必要がある |
| テスト可能性 | オプションは比較可能 | 構造体の比較 |
| 複雑性 | より多くのボイラープレート | より単純なセットアップ |
設定構造体を使用する方が好ましい場合: オプションが 3 個未満、オプションがめったに変わらない、すべてのオプションが通常一緒に指定される、または内部 API のみの場合。
関数型オプションと設定構造体の選択、適切なデフォルト値を持つ設定構造体 API の設計、または複雑なコンストラクタのハイブリッドアプローチの評価を決定する際は、
references/OPTIONS-VS-STRUCTS.mdをお読みください。
クロージャを使わない理由
別の実装方法はクロージャを使用します:
// クロージャアプローチ (推奨されません)
type Option func(*options)
func WithCache(c bool) Option {
return func(o *options) { o.cache = c }
}
インターフェースアプローチが推奨される理由:
- テスト可能性 - オプションはテストやモックで比較できます
- デバッグ可能性 - オプションは
fmt.Stringerを実装できます - 柔軟性 - オプションは追加のインターフェースを実装できます
- 可視性 - Option 型はドキュメンテーションで可視化されます
クイックリファレンス
// 1. デフォルト値を持つエクスポートされていない options 構造体
type options struct {
field1 Type1
field2 Type2
}
// 2. エクスポートされた Option インターフェース、エクスポートされていないメソッド
type Option interface {
apply(*options)
}
// 3. Option 型 + apply + With* コンストラクタ
type field1Option Type1
func (o field1Option) apply(opts *options) { opts.field1 = Type1(o) }
func WithField1(v Type1) Option { return field1Option(v) }
// 4. コンストラクタはデフォルト値の上にオプションを適用
func New(required string, opts ...Option) (*Thing, error) {
o := options{field1: defaultField1, field2: defaultField2}
for _, opt := range opts {
opt.apply(&o)
}
// ...
}
チェックリスト
-
options構造体はエクスポートされていない -
Optionインターフェースはエクスポートされていないapplyメソッドを持つ - 各オプションは
With*コンストラクタを持つ - デフォルト値はオプションを適用する前に設定される
- 必須パラメータは
...Optionから分離されている
関連スキル
- インターフェース設計:
Optionインターフェースを設計する場合、またはインターフェースとクロージャアプローチの間で選択する場合は、go-interfacesを参照してください - 命名規則:
With*コンストラクタ、オプション型、またはエクスポートされていない options 構造体に名前を付ける場合は、go-namingを参照してください - 関数設計: ファイル内でコンストラクタを整理したり、可変長シグネチャをフォーマットしたりする場合は、
go-functionsを参照してください - ドキュメンテーション:
Option型、With*関数、またはコンストラクタの動作を文書化する場合は、go-documentationを参照してください
外部リソース
- Self-referential functions and the design of options - Rob Pike
- Functional options for friendly APIs - Dave Cheney
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- cxuu
- リポジトリ
- cxuu/golang-skills
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/cxuu/golang-skills / ライセンス: Apache-2.0
関連スキル
nano-banana-2
inference.sh CLIを通じてGoogle Gemini 3.1 Flash Image Preview(Nano Banana 2)で画像を生成します。テキストから画像を生成する機能、画像編集、最大14枚の複数画像入力、Google Searchグラウンディング機能に対応しています。トリガーワード:「nano banana 2」「nanobanana 2」「gemini 3.1 flash image」「gemini 3 1 flash image preview」「google image generation」
octocode-slides
洗練されたマルチファイル形式のHTMLプレゼンテーションを生成します。6段階のフロー(概要 → リサーチ → アウトライン → デザイン → 実装 → レビュー)で構成されています。各スライドは独立したHTMLファイルとなり、iframeで読み込まれます。「スライドを作成してほしい」「プレゼンテーションを作ってほしい」「HTMLスライドを生成してほしい」「デックを構築してほしい」といった依頼や、ノート・ドキュメント・コードを洗練されたプレゼンテーションに変換する際に使用できます。
gpt-image2-ppt
OpenAIのgpt-image-2を使用して、視覚的に優れたPPTスライドを生成します。Spatial Glass、Tech Blue、Editorial Monoなど10種類のキュレーション済みスタイルに対応し、ユーザーが提供したPPTXファイルを模倣するテンプレートクローンモードも搭載しています。HTMLビューアと16:9形式のPPTXファイルを出力します。プレゼンテーション、スライド、ピッチデック、投資家向けPPT、雑誌風PPTの作成依頼などで活用してください。
nano-banana
Nano Banana PRO(Gemini 3 Pro Image)およびNano Banana(Gemini 2.5 Flash Image)を使用したAI画像生成機能です。以下の場合に活用できます:(1)テキストプロンプトからの画像生成、(2)既存画像の編集、(3)インフォグラフィックス、ロゴ、商品写真、ステッカーなどのプロフェッショナルなビジュアルアセット制作、(4)複数画像での人物キャラクターの一貫性保持、(5)正確なテキスト描画を含む画像生成、(6)AI生成ビジュアルが必要なあらゆるタスク。「画像を生成」「画像を作成」「写真を作る」「ロゴをデザイン」「インフォグラフィックスを作成」「AI画像」「nano banana」またはその他の画像生成リクエストをトリガーとして機能します。
oiloil-ui-ux-guide
モダンでクリーンなUI/UXガイダンス・レビュースキルです。新機能や既存システム(Webアプリ)に対して、実行可能なUI/UX改善提案、デザイン原則、デザインレビューチェックリストが必要な場合に活用できます。CRAP(コントラスト・反復・配置・近接)をベースに、タスクファーストなUX、情報設計、フィードバック・システムステータス、一貫性、affordances、エラー防止・復旧、認知負荷を重視します。モダンミニマルスタイル(クリーン・余白・タイポグラフィ主導)を強制し、不要なテキストを削減、アイコンとしての絵文字を禁止し、統一されたアイコンセットから直感的で洗練されたアイコンを推奨します。
axiom-hig-ref
Apple Human Interface Guidelines リファレンス — 色(セマンティックカラー、カスタムカラー、パターン)、背景(マテリアル階層、ダイナミック背景)、タイポグラフィ(標準スタイル、カスタムフォント、Dynamic Type)、SF Symbols(レンダリングモード、色、多言語対応)、ダークモード、アクセシビリティ、プラットフォーム固有の考慮事項を網羅したガイドラインです。