go-packages
Goパッケージの作成、importの整理、依存関係の管理、またはGoコードをパッケージに分割する構成を検討する際に使用します。新しいGoプロジェクトを開始するときや、肥大化したコードベースをパッケージに分割する際にも、ユーザーが明示的にパッケージ構成を尋ねていなくても適用されます。個々の識別子の命名については対象外です(go-namingを参照)。
description の原文を見る
Use when creating Go packages, organizing imports, managing dependencies, or deciding how to structure Go code into packages. Also use when starting a new Go project or splitting a growing codebase into packages, even if the user doesn't explicitly ask about package organization. Does not cover naming individual identifiers (see go-naming).
SKILL.md 本文
Go パッケージとインポート
このスキルが適用されない場合: パッケージ内の個別の識別子の命名については、
go-namingを参照してください。単一ファイル内の関数の編成については、go-functionsを参照してください。インポート規則を強制するリンターの設定については、go-lintingを参照してください。
パッケージの編成
Util パッケージを避ける
パッケージ名は、パッケージが提供するものを説明する必要があります。util、helper、common のような一般的な名前は避けてください。意味を曖昧にし、インポート競合を引き起こします。
// 良い例: 意味のあるパッケージ名
db := spannertest.NewDatabaseFromFile(...)
_, err := f.Seek(0, io.SeekStart)
// 悪い例: 曖昧な名前は意味を隠す
db := test.NewDatabaseFromFile(...)
_, err := f.Seek(0, common.SeekStart)
一般的な名前は名前の一部として使用できます (例: stringutil) が、パッケージ全体の名前になるべきではありません。
パッケージサイズ
| 質問 | アクション |
|---|---|
| 目的を 1 文で説明できますか? | いいえ → 責務ごとに分割 |
| ファイルがエクスポートされていないシンボルを共有しない? | これらのファイルは別のパッケージにできます |
| ユーザーグループが異なる部分を使用する? | ユーザーの境界に沿って分割 |
| Godoc ページが圧倒的? | 発見性を改善するために分割 |
分割しないでください: ファイルが長いだけの理由、単一型パッケージを作成するため、または循環依存を作成する場合。
パッケージを分割するか結合するか、パッケージ内でファイルを編成するか、CLI プログラムを構造化するかを決定するときは、
references/PACKAGE-SIZE.mdを読んでください。
インポート
インポートは空行で区切られたグループに編成されます。標準ライブラリパッケージが常に最初に来ます。goimports を使用して自動的に管理してください。
import (
"fmt"
"os"
"github.com/foo/bar"
"rsc.io/goversion/version"
)
クイックルール:
| ルール | ガイダンス |
|---|---|
| グループ化 | stdlib が最初、その後外部。拡張: stdlib → その他 → proto → 副作用 |
| 名前変更 | 衝突がない限り避けてください。最も局所的なインポートの名前を変更します。Proto パッケージは pb サフィックス付き |
ブランクインポート (import _) | main パッケージまたはテストのみ |
ドットインポート (import .) | 循環依存テストファイルを除き、決して使用しないでください |
拡張グループ化でインポートを編成する、proto パッケージの名前を変更する、またはブランク/ドットインポートを決定するときは、
references/IMPORTS.mdを読んでください。
init() を避ける
可能な限り init() を避けてください。避けられない場合、次の要件を満たす必要があります:
- 完全に決定的である
- 他の
init()の順序付けから独立している - 環境状態がない (環境変数、作業ディレクトリ、引数)
- I/O がない (ファイルシステム、ネットワーク、システムコール)
許容される使用: 単一の割り当てにできない複雑な式、プラグイン可能なフック (database/sql ダイアレクトなど)、決定的な事前計算。
init() を明示的な関数にリファクタリングする必要がある場合、または許容される init() の使用を理解する場合は、
references/PACKAGE-SIZE.mdを読んでください。
Main での終了
os.Exit または log.Fatal* を呼び出すのは main() でのみ です。他のすべての関数はエラーを返すべきです。
理由: 明らかでない制御フロー、テスト不可能、defer ステートメントがスキップされます。
ベストプラクティス: run() パターンを使用します — ロジックを func run() error に抽出し、単一の終了ポイントで main() から呼び出します:
func main() {
if err := run(); err != nil {
log.Fatal(err)
}
}
run() パターンを実装する、CLI サブコマンドを構造化する、またはフラグ命名規則を選択するときは、
references/PACKAGE-SIZE.mdを読んでください。
コマンドラインフラグ
アドバイス: フラグは
package mainでのみ定義してください。
- フラグ名は
snake_caseを使用します:--outputDirではなく--output_dir - ライブラリはパラメータとして設定を受け入れるべき、直接フラグを読むべきではありません — これにより、テスト可能で再利用可能なままになります
- 標準の
flagパッケージを優先します。POSIX 規約 (ダブルダッシュ、シングルキャラクタショートカット) が必要な場合のみpflagを使用します
// 良い例: main でのフラグ、ライブラリへのパラメータとして渡される
func main() {
outputDir := flag.String("output_dir", ".", "directory for output files")
flag.Parse()
if err := mylib.Generate(*outputDir); err != nil {
log.Fatal(err)
}
}
関連スキル
- パッケージの命名: パッケージ名の選択、スタッタリングの回避、またはエクスポートされたシンボルの命名については、
go-namingを参照してください - パッケージ間のエラーハンドリング:
%wvs%vでパッケージ境界でエラーをラップするときは、go-error-handlingを参照してください - インポートリント: goimports local-prefixes を設定したり、インポートグループ化を強制したりするときは、
go-lintingを参照してください - グローバル状態:
init()を明示的な初期化で置き換えたり、可変グローバルを避けたりするときは、go-defensiveを参照してください
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- cxuu
- リポジトリ
- cxuu/golang-skills
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/cxuu/golang-skills / ライセンス: Apache-2.0
関連スキル
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を通じてオンチェーン取引とデータ照会を実現します。