go-generics
Go のジェネリクスを使うべきか判断する際や、ジェネリック関数・型の実装、制約の選択、型エイリアスと型定義の使い分けに活用できます。ユーザーが明示的にジェネリクスに言及しない場合でも、複数の型に対応するユーティリティ関数を作成しようとしている際に適用されます。ジェネリクスを使わないインターフェース設計は対象外です(go-interfaces を参照)。
description の原文を見る
Use when deciding whether to use Go generics, writing generic functions or types, choosing constraints, or picking between type aliases and type definitions. Also use when a user is writing a utility function that could work with multiple types, even if they don't mention generics explicitly. Does not cover interface design without generics (see go-interfaces).
SKILL.md 本文
Go ジェネリクスと型パラメータ
ジェネリクスをいつ使うか
まず具体的な型で書く。2 番目の型が現れたときだけジェネリクスを使う。
ジェネリクスを優先する場合
- 複数の型が同じロジックを共有している(ソート、フィルタリング、map/reduce)
- そうでなければ
anyと過度なタイプスイッチに依存することになる - 再利用可能なデータ構造を構築している(並行安全なセット、順序付きマップ)
ジェネリクスを避ける場合
- 実際には 1 つの型しかインスタンス化されていない
- インターフェースが共有の動作をきれいにモデル化している
- ジェネリクスコードが型固有の代替案より読みにくい
「コードを書く、型を設計するのではない」— Robert Griesemer and Ian Lance Taylor
判断フロー
複数の型が同じロジックを共有していますか?
├─ いいえ → 具体的な型を使う
├─ はい → 有用なインターフェースを共有していますか?
│ ├─ はい → インターフェースを使う
│ └─ いいえ → ジェネリクスを使う
悪い例:
// 早すぎるジェネリクス化:実際には int でしか呼ばれない
func Sum[T constraints.Integer | constraints.Float](vals []T) T {
var total T
for _, v := range vals {
total += v
}
return total
}
良い例:
func SumInts(vals []int) int {
var total int
for _, v := range vals {
total += v
}
return total
}
型パラメータの命名
| 名前 | 典型的な用途 |
|---|---|
T | 汎用型パラメータ |
K | マップキー型 |
V | マップ値型 |
E | 要素型 |
複雑な制約の場合は、短い説明的な名前も許容されます:
func Marshal[Opts encoding.MarshalOptions](v any, opts Opts) ([]byte, error)
型エイリアスと型定義
型エイリアス(type Old = new.Name)はめったに使わない — パッケージの移行や段階的な API リファクタリング時だけ使う。
制約の合成
~(基礎型)と |(ユニオン)で制約を組み合わせる:
type Numeric interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 |
~float32 | ~float64
}
func Sum[T Numeric](vals []T) T {
var total T
for _, v := range vals {
total += v
}
return total
}
独自の制約を書く代わりに、constraints パッケージまたは cmp パッケージ(Go 1.21+)の cmp.Ordered などの標準的な制約を使う。
カスタム型制約を書く、
~と|で制約を合成する、または型推論の問題をデバッグする場合はreferences/CONSTRAINTS.mdを参照してください。
よくあるピットフォール
標準ライブラリの型をラップしない
// 悪い例:ジェネリックラッパーは値なしで複雑性を追加する
type Set[T comparable] struct {
m map[T]struct{}
}
// 良い例:使用がシンプルな場合は map[T]struct{} を直接使う
seen := map[string]struct{}{}
ジェネリクスが複雑性に見合う価値があるのは、複数の呼び出しサイト間の重複を排除する場合です。単一用途のジェネリクスは単なる間接参照です。
インターフェース実装のためにジェネリクスを使わない
// 悪い例:T はインターフェース満たすためだけに使われる — インターフェースを直接使う
func Process[T io.Reader](r T) error { ... }
// 良い例:インターフェースを直接受け入れる
func Process(r io.Reader) error { ... }
過度に制約を厳しくしない
// 悪い例:制約は必要以上に制限的
func Contains[T interface{ ~int | ~string }](slice []T, target T) bool { ... }
// 良い例:comparable で十分
func Contains[T comparable](slice []T, target T) bool { ... }
クイックリファレンス
| トピック | ガイダンス |
|---|---|
| ジェネリクスをいつ使うか | 複数の型が同じロジックを共有し、インターフェースが不十分な場合のみ |
| 開始地点 | まず具体的なコードを書く;後で汎用化する |
| 命名 | 単一の大文字(T、K、V、E) |
| 型エイリアス | 同じ型、別の名前;移行目的でのみ使う |
| 制約の合成 | 基礎型には ~、ユニオンには ` |
| よくあるピットフォール | 単一用途コードをジェネリクス化しない;インターフェースで十分な場合も同様 |
関連スキル
- インターフェースとジェネリクス: インターフェースが既に共有の動作をジェネリクスなしでモデル化しているかを判断する場合は
go-interfacesを参照 - 型の宣言: 新しい型を定義するとき、型エイリアスを選ぶとき、または型定義とエイリアスのどちらかを選ぶときは
go-declarationsを参照 - ジェネリック API のドキュメント化: ジェネリック関数の doc コメントと実行可能なサンプルを書く場合は
go-documentationを参照 - 型パラメータの命名: 型パラメータまたは制約インターフェースの名前を選ぶ場合は
go-namingを参照
ライセンス: 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(レンダリングモード、色、多言語対応)、ダークモード、アクセシビリティ、プラットフォーム固有の考慮事項を網羅したガイドラインです。