Agent Skills by ALSEL
Anthropic Claudeその他⭐ リポ 0品質スコア 50/100

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 コードを書く際に、このドキュメントのターゲットバージョンまでの全ての機能を使用してください:

  • レガシーパターンより slicesmapscmp などの最新組み込みおよびパッケージを優先してください
  • ターゲットより新しい 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.FieldsSeqbytes.SplitSeqbytes.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
リポジトリ
jetbrains/go-modern-guidelines
ライセンス
Apache-2.0
最終更新
不明

Source: https://github.com/jetbrains/go-modern-guidelines / ライセンス: Apache-2.0

関連スキル

汎用その他⭐ リポ 1,982

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

by LeoYeAI
汎用その他⭐ リポ 100

civ-finish-quotes

実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。

by huxiuhan
汎用その他⭐ リポ 1,110

nookplot

Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。

by BankrBot
汎用その他⭐ リポ 59

web3-polymarket

Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。

by elophanto
汎用その他⭐ リポ 52

ethskills

Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。

by jiayaoqijia
汎用その他⭐ リポ 44

xxyy-trade

このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。

by Jimmy-Holiday
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: jetbrains · jetbrains/go-modern-guidelines · ライセンス: Apache-2.0