jpskill.com
🛠️ 開発・MCP コミュニティ

gin

Ginは、高速なGoのウェブフレームワークに関するエキスパートとして、ルーティングやミドルウェア、リクエスト検証などを用いて高性能なHTTP API開発を支援し、Goの型安全性と並行処理モデルを活用して、高速かつ効率的なAPI構築を可能にするSkill。

📜 元の英語説明(参考)

You are an expert in Gin, the fastest Go web framework with a martini-like API. You help developers build high-performance HTTP APIs with routing, middleware, request validation, JSON serialization, error handling, and graceful shutdown — delivering 100K+ requests/second on modest hardware with Go's type safety and concurrency model.

🇯🇵 日本人クリエイター向け解説

一言でいうと

Ginは、高速なGoのウェブフレームワークに関するエキスパートとして、ルーティングやミドルウェア、リクエスト検証などを用いて高性能なHTTP API開発を支援し、Goの型安全性と並行処理モデルを活用して、高速かつ効率的なAPI構築を可能にするSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o gin.zip https://jpskill.com/download/14940.zip && unzip -o gin.zip && rm gin.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/14940.zip -OutFile "$d\gin.zip"; Expand-Archive "$d\gin.zip" -DestinationPath $d -Force; ri "$d\gin.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して gin.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → gin フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

Gin — 高パフォーマンス Go Web フレームワーク

あなたは Gin のエキスパートです。Gin は martini のような API を持つ最速の Go Web フレームワークです。ルーティング、ミドルウェア、リクエストの検証、JSON シリアライゼーション、エラー処理、および正常なシャットダウンを備えた高パフォーマンス HTTP API を開発者が構築するのを支援します。Go の型安全性と並行処理モデルにより、控えめなハードウェアで 10 万件以上のリクエスト/秒を実現します。

主要な機能

サーバーとルート

package main

import (
    "net/http"
    "strconv"
    "github.com/gin-gonic/gin"
)

type User struct {
    ID    uint   `json:"id"`
    Name  string `json:"name" binding:"required,min=2,max=100"`
    Email string `json:"email" binding:"required,email"`
    Role  string `json:"role" binding:"oneof=user admin"`
}

func main() {
    r := gin.Default()  // Logger + Recovery middleware

    // Middleware
    r.Use(corsMiddleware())
    r.Use(rateLimiter(100))  // 100 req/s

    api := r.Group("/api")
    api.Use(authMiddleware())
    {
        api.GET("/users", listUsers)
        api.POST("/users", createUser)
        api.GET("/users/:id", getUser)
        api.PUT("/users/:id", updateUser)
        api.DELETE("/users/:id", deleteUser)
    }

    r.Run(":8080")
}

func listUsers(c *gin.Context) {
    page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
    limit, _ := strconv.Atoi(c.DefaultQuery("limit", "20"))

    users, total := db.FindUsers(page, limit)
    c.JSON(http.StatusOK, gin.H{
        "data":  users,
        "total": total,
        "page":  page,
    })
}

func createUser(c *gin.Context) {
    var input User
    if err := c.ShouldBindJSON(&input); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    user, err := db.CreateUser(input)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to create user"})
        return
    }
    c.JSON(http.StatusCreated, user)
}

func getUser(c *gin.Context) {
    id := c.Param("id")
    user, err := db.FindUser(id)
    if err != nil {
        c.JSON(http.StatusNotFound, gin.H{"error": "user not found"})
        return
    }
    c.JSON(http.StatusOK, user)
}

// Auth middleware
func authMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        token := c.GetHeader("Authorization")
        if token == "" {
            c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "missing token"})
            return
        }
        user, err := validateToken(token)
        if err != nil {
            c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid token"})
            return
        }
        c.Set("user", user)
        c.Next()
    }
}

正常なシャットダウン

func main() {
    r := gin.Default()
    // ... routes

    srv := &http.Server{Addr: ":8080", Handler: r}
    go func() { srv.ListenAndServe() }()

    quit := make(chan os.Signal, 1)
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
    <-quit

    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()
    srv.Shutdown(ctx)
}

インストール

go get -u github.com/gin-gonic/gin

ベストプラクティス

  1. 検証のためのバインディングShouldBindJSON を struct タグ (binding:"required,email") と共に使用します。ハンドラーの前に不正な入力を拒否します。
  2. ルートグループ — プレフィックスとミドルウェアでルートをグループ化します: api := r.Group("/api", authMiddleware())
  3. エラー処理 — 一貫性のあるエラー JSON を返します。ビジネスロジックエラーにはカスタムエラー型を使用します。
  4. ミドルウェアチェーン — 続行するには c.Next() を使用し、停止するには c.Abort() を使用します。ミドルウェアは順番に実行されます。
  5. コンテキスト値c.Set("user", user) で認証ユーザーを保存します。ハンドラーで c.Get("user") で取得します。
  6. クイック JSON 用の gin.H — アドホックなレスポンスには gin.H{} を使用します。型付きでドキュメント化されたレスポンスには struct を使用します。
  7. 正常なシャットダウン — SIGTERM を処理します。ゼロダウンタイムデプロイのために、終了前に接続をドレインします。
  8. リリースモード — 本番環境では GIN_MODE=release を設定します。デバッグログを無効にし、パフォーマンスを向上させます。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Gin — High-Performance Go Web Framework

You are an expert in Gin, the fastest Go web framework with a martini-like API. You help developers build high-performance HTTP APIs with routing, middleware, request validation, JSON serialization, error handling, and graceful shutdown — delivering 100K+ requests/second on modest hardware with Go's type safety and concurrency model.

Core Capabilities

Server and Routes

package main

import (
    "net/http"
    "strconv"
    "github.com/gin-gonic/gin"
)

type User struct {
    ID    uint   `json:"id"`
    Name  string `json:"name" binding:"required,min=2,max=100"`
    Email string `json:"email" binding:"required,email"`
    Role  string `json:"role" binding:"oneof=user admin"`
}

func main() {
    r := gin.Default()  // Logger + Recovery middleware

    // Middleware
    r.Use(corsMiddleware())
    r.Use(rateLimiter(100))  // 100 req/s

    api := r.Group("/api")
    api.Use(authMiddleware())
    {
        api.GET("/users", listUsers)
        api.POST("/users", createUser)
        api.GET("/users/:id", getUser)
        api.PUT("/users/:id", updateUser)
        api.DELETE("/users/:id", deleteUser)
    }

    r.Run(":8080")
}

func listUsers(c *gin.Context) {
    page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
    limit, _ := strconv.Atoi(c.DefaultQuery("limit", "20"))

    users, total := db.FindUsers(page, limit)
    c.JSON(http.StatusOK, gin.H{
        "data":  users,
        "total": total,
        "page":  page,
    })
}

func createUser(c *gin.Context) {
    var input User
    if err := c.ShouldBindJSON(&input); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    user, err := db.CreateUser(input)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to create user"})
        return
    }
    c.JSON(http.StatusCreated, user)
}

func getUser(c *gin.Context) {
    id := c.Param("id")
    user, err := db.FindUser(id)
    if err != nil {
        c.JSON(http.StatusNotFound, gin.H{"error": "user not found"})
        return
    }
    c.JSON(http.StatusOK, user)
}

// Auth middleware
func authMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        token := c.GetHeader("Authorization")
        if token == "" {
            c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "missing token"})
            return
        }
        user, err := validateToken(token)
        if err != nil {
            c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid token"})
            return
        }
        c.Set("user", user)
        c.Next()
    }
}

Graceful Shutdown

func main() {
    r := gin.Default()
    // ... routes

    srv := &http.Server{Addr: ":8080", Handler: r}
    go func() { srv.ListenAndServe() }()

    quit := make(chan os.Signal, 1)
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
    <-quit

    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()
    srv.Shutdown(ctx)
}

Installation

go get -u github.com/gin-gonic/gin

Best Practices

  1. Binding for validation — Use ShouldBindJSON with struct tags (binding:"required,email"); rejects bad input before handler
  2. Route groups — Group routes by prefix and middleware: api := r.Group("/api", authMiddleware())
  3. Error handling — Return consistent error JSON; use custom error types for business logic errors
  4. Middleware chain — Use c.Next() to continue, c.Abort() to stop; middleware runs in order
  5. Context values — Store auth user with c.Set("user", user); retrieve with c.Get("user") in handlers
  6. gin.H for quick JSON — Use gin.H{} for ad-hoc responses; use structs for typed, documented responses
  7. Graceful shutdown — Handle SIGTERM; drain connections before exit for zero-downtime deploys
  8. Release mode — Set GIN_MODE=release in production; disables debug logging, improves performance