use-modern-go
プロジェクトのGoバージョンに基づいて、モダンなGo構文のガイドラインを適用します。ユーザーがモダンなGoコードのガイドラインを求めた際に使用してください。
description の原文を見る
Apply modern Go syntax guidelines based on project's Go version. Use when user ask for modern Go code guidelines.
SKILL.md 本文
最新 Go ガイドライン
検出された Go バージョン
!grep -rh "^go " --include="go.mod" . 2>/dev/null | cut -d' ' -f2 | sort | uniq -c | sort -nr | head -1 | xargs | cut -d' ' -f2 | grep . || echo unknown
このスキルの使い方
go.mod ファイルを検索したり、自分でバージョンを検出しようとしないでください。上記に表示されたバージョンのみを使用してください。
バージョンが検出された場合(「unknown」ではない):
- 次のように言ってください:「このプロジェクトは Go X.XX を使用しているので、最新 Go のベストプラクティスに従い、このバージョン以下の言語機能を自由に使用します。別のターゲットバージョンをご希望の場合は、お知らせください。」
- 機能をリストアップしないでください。確認を求めないでください
バージョンが「unknown」の場合:
- 次のように言ってください:「このリポジトリで Go バージョンを検出できませんでした」
- AskUserQuestion を使用してください:「どの Go バージョンをターゲットにしますか?」→ [1.23] / [1.24] / [1.25] / [1.26]
Go コードを書く際に、このドキュメントのターゲットバージョンまでの全ての機能を使用してください:
- レガシーパターンより
slices、maps、cmpなどの最新組み込みおよびパッケージを優先してください - ターゲットより新しい Go バージョンの機能を使用しないでください
- 最新の代替案が利用可能な場合、廃止されたパターンを使用しないでください
Go バージョン別機能
Go 1.0+
time.Since:time.Now().Sub(start)の代わりにtime.Since(start)を使用
Go 1.8+
time.Until:deadline.Sub(time.Now())の代わりにtime.Until(deadline)を使用
Go 1.13+
errors.Is:err == targetの代わりにerrors.Is(err, target)を使用(ラップされたエラーに対応)
Go 1.18+
any:interface{}の代わりにanyを使用bytes.Cut: Index + スライスの代わりにbefore, after, found := bytes.Cut(b, sep)を使用strings.Cut:before, after, found := strings.Cut(s, sep)を使用
Go 1.19+
fmt.Appendf:[]byte(fmt.Sprintf(...))の代わりにbuf = fmt.Appendf(buf, "x=%d", x)を使用atomic.Bool/atomic.Int64/atomic.Pointer[T]:atomic.StoreInt32の代わりに型安全なアトミック操作を使用
var flag atomic.Bool
flag.Store(true)
if flag.Load() { ... }
var ptr atomic.Pointer[Config]
ptr.Store(cfg)
Go 1.20+
strings.Clone: メモリ共有なしで文字列をコピーするにはstrings.Clone(s)を使用bytes.Clone: バイトスライスをコピーするにはbytes.Clone(b)を使用strings.CutPrefix/CutSuffix:if rest, ok := strings.CutPrefix(s, "pre:"); ok { ... }を使用errors.Join: 複数のエラーを結合するにはerrors.Join(err1, err2)を使用context.WithCancelCause:ctx, cancel := context.WithCancelCause(parent)その後cancel(err)を使用context.Cause: キャンセルの原因となったエラーを取得するにはcontext.Cause(ctx)を使用
Go 1.21+
組み込み関数:
min/max: if/else 比較の代わりにmax(a, b)を使用clear: マップエントリを全て削除するにはclear(m)を、スライス要素をゼロにするにはclear(s)を使用
slices パッケージ:
slices.Contains: 手動ループの代わりにslices.Contains(items, x)を使用slices.Index: インデックスを返すslices.Index(items, x)(見つからない場合は -1)slices.IndexFunc:slices.IndexFunc(items, func(item T) bool { return item.ID == id })slices.SortFunc:slices.SortFunc(items, func(a, b T) int { return cmp.Compare(a.X, b.X) })slices.Sort: 順序付き型にはslices.Sort(items)を使用slices.Max/slices.Min: 手動ループの代わりにslices.Max(items)を使用slices.Reverse: 手動スワップループの代わりにslices.Reverse(items)を使用slices.Compact: 連続した重複を in-place で削除するにはslices.Compact(items)を使用slices.Clip: 未使用の容量を削除するにはslices.Clip(s)を使用slices.Clone: コピーを作成するにはslices.Clone(s)を使用
maps パッケージ:
maps.Clone: 手動マップ反復の代わりにmaps.Clone(m)を使用maps.Copy: src から dst にエントリをコピーするにはmaps.Copy(dst, src)を使用maps.DeleteFunc:maps.DeleteFunc(m, func(k K, v V) bool { return condition })
sync パッケージ:
sync.OnceFunc:sync.Once+ ラッパーの代わりにf := sync.OnceFunc(func() { ... })を使用sync.OnceValue:getter := sync.OnceValue(func() T { return computeValue() })
context パッケージ:
context.AfterFunc: キャンセル時にクリーンアップを実行するにはstop := context.AfterFunc(ctx, cleanup)を使用context.WithTimeoutCause:ctx, cancel := context.WithTimeoutCause(parent, d, err)context.WithDeadlineCause: 期間の代わりにデッドラインを使用する同様の機能
Go 1.22+
ループ:
for i := range n:for i := 0; i < len(items); i++の代わりにfor i := range len(items)を使用- ループ変数はゴルーチンでキャプチャすることが安全になりました(各反復は独自のコピーを持つ)
cmp パッケージ:
cmp.Or: 最初の非ゼロ値を返すcmp.Or(flag, env, config, "default")
// 代わりに:
name := os.Getenv("NAME")
if name == "" {
name = "default"
}
// 以下を使用:
name := cmp.Or(os.Getenv("NAME"), "default")
reflect パッケージ:
reflect.TypeFor:reflect.TypeOf((*T)(nil)).Elem()の代わりにreflect.TypeFor[T]()
net/http:
- 拡張された
http.ServeMuxパターン:メソッドおよびパスパラメータ付きmux.HandleFunc("GET /api/{id}", handler) - パスパラメータを取得するには
r.PathValue("id")を使用
Go 1.23+
maps.Keys(m)/maps.Values(m)はイテレータを返すslices.Collect(iter)はイテレータからスライスをビルドするための手動ループではなくslices.Sorted(iter)は 1 ステップで収集およびソート
keys := slices.Collect(maps.Keys(m)) // ではなく:for k := range m { keys = append(keys, k) }
sortedKeys := slices.Sorted(maps.Keys(m)) // 収集 + ソート
for k := range maps.Keys(m) { process(k) } // 直接反復
time パッケージ
time.Tick: Go 1.23 の時点では、ガベージコレクタは参照されていないティッカーを回復できるため、time.Tickを自由に使用してください。停止されていない場合でも同様です。Stop メソッドはもはやガベージコレクタを支援する必要はありません。Tick が機能する場合、NewTicker を優先する理由はもうありません。
Go 1.24+
- テストで
context.WithCancel(context.Background())ではなくt.Context()を使用 テスト関数がコンテキストを必要とする場合は、常にt.Context()を使用します。
Before:
func TestFoo(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
result := doSomething(ctx)
}
After:
func TestFoo(t *testing.T) {
ctx := t.Context()
result := doSomething(ctx)
}
- JSON 構造体タグで
omitemptyではなくomitzeroを使用 time.Duration、time.Time、構造体、スライス、マップには常に omitzero を使用します。
Before:
type Config struct {
Timeout time.Duration `json:"timeout,omitempty"` // Duration には機能しません!
}
After:
type Config struct {
Timeout time.Duration `json:"timeout,omitzero"`
}
- ベンチマークで
for i := 0; i < b.N; i++ではなくb.Loop()を使用 ベンチマーク関数のメインループには常にb.Loop()を使用します。
Before:
func BenchmarkFoo(b *testing.B) {
for i := 0; i < b.N; i++ {
doWork()
}
}
After:
func BenchmarkFoo(b *testing.B) {
for b.Loop() {
doWork()
}
}
- 反復時に
strings.Splitではなくstrings.SplitSeqを使用 for-range ループで分割結果を反復する場合は、常に SplitSeq/FieldsSeq を使用します。
Before:
for _, part := range strings.Split(s, ",") {
process(part)
}
After:
for part := range strings.SplitSeq(s, ",") {
process(part)
}
また:strings.FieldsSeq、bytes.SplitSeq、bytes.FieldsSeq。
Go 1.25+
sync.WaitGroupでゴルーチンをスポーンする場合、wg.Add(1)+go func() { defer wg.Done(); ... }()ではなくwg.Go(fn)を使用 ゴルーチンをスポーンする場合は常にwg.Go()を使用します。
Before:
var wg sync.WaitGroup
for _, item := range items {
wg.Add(1)
go func() {
defer wg.Done()
process(item)
}()
}
wg.Wait()
After:
var wg sync.WaitGroup
for _, item := range items {
wg.Go(func() {
process(item)
})
}
wg.Wait()
Go 1.26+
x := val; &xではなくnew(val)を使用—任意の値へのポインタを返します。 Go 1.26 では new() が型だけでなく式も受け入れるように拡張されました。 型は推論されます:new(0) → *int、new("s") → *string、new(T{}) → *T。x := val; &xパターンを使用しないでください—常にnew(val)を直接使用します。new(int(0))のような冗長なキャストを使用しないでください—単にnew(0)と書いてください。 一般的な使用例:ポインタ型を持つ構造体フィールド。
Before:
timeout := 30
debug := true
cfg := Config{
Timeout: &timeout,
Debug: &debug,
}
After:
cfg := Config{
Timeout: new(30), // *int
Debug: new(true), // *bool
}
errors.As(err, &target)ではなくerrors.AsType[T](err)を使用 エラーが特定の型と一致するかどうかをチェックする場合は、常に errors.AsType を使用します。
Before:
var pathErr *os.PathError
if errors.As(err, &pathErr) {
handle(pathErr)
}
After:
if pathErr, ok := errors.AsType[*os.PathError](err); ok {
handle(pathErr)
}
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- jetbrains
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/jetbrains/go-modern-guidelines / ライセンス: 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を通じてオンチェーン取引とデータ照会を実現します。