Contents
VS Code で快適にコーディングするための設定
必要な拡張機能
| 拡張 | 主な機能 |
|---|---|
| Go (golang.Go) | LSP、コード補完、テスト実行、デバッグ |
| GitLens | Git 履歴・ブレーム表示 |
| Docker | Dockerfile のシンタックスハイライト、ビルド支援 |
| Error Lens | コンパイルエラーや警告をインラインで可視化 |
公式の Go 拡張は
gopls(Go Language Server)を内部で利用しています。最新バージョンは VS Code Marketplace のページでも随時更新されます。
推奨設定例 (settings.json)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "go.useLanguageServer": true, "go.formatTool": "gofmt", "editor.codeActionsOnSave": { "source.organizeImports": true, "source.fixAll": true }, "[go]": { "editor.defaultFormatter": "golang.go" } } |
設定のポイント
- Language Server の有効化でインテリセンスが高速に動作。
- 保存時に import 整理・自動フォーマットすることで、コードレビューで指摘される機会を減らす。
- Error Lensはコンパイルエラーが即座に分かり、初心者の学習サイクル(書く → テスト → デバッグ)をスムーズにします。
Docker & DevContainer による統一開発環境の作り方
なぜコンテナ化するのか?
- 環境差異の排除:ローカル PC の OS が macOS、Windows、Linux でも同一イメージで動作。
- CI と完全に同期:GitHub Actions や Azure Pipelines で使用しているイメージと同じものをローカルでも利用できる。
必要なファイル
Dockerfile
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# ビルドステージ FROM golang:1.22-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main . # 実行ステージ(軽量イメージ) FROM alpine:latest WORKDIR /root/ COPY --from=builder /app/main . CMD ["./main"] |
.devcontainer/devcontainer.json
|
1 2 3 4 5 6 7 8 9 |
{ "name": "Go Dev Container", "image": "golang:1.22-alpine", "features": { "ghcr.io/devcontainers/features/go:1": {} }, "postCreateCommand": "go mod tidy" } |
VS Code での利用手順
- プロジェクト直下に上記ファイルを配置。
- コマンドパレット(
F1)→ Remote‑Containers: Reopen in Container を選択。 - コンテナが立ち上がったら、ターミナルは自動的に
/appに移動し、go test ./...がすぐ実行できる状態になります。
公式ドキュメント – Developing inside a Container(https://code.visualstudio.com/docs/devcontainers/containers)
Go Modules の基本操作と CI への組み込み
基本コマンド
| コマンド | 説明 |
|---|---|
go mod init <module> |
新規モジュール作成。例: github.com/yourname/project |
go get <pkg>@vX.Y.Z |
依存パッケージを取得(バージョン指定可) |
go mod tidy |
未使用の依存を削除し、必要なものだけを go.mod / go.sum に残す |
go test ./... && go vet ./... |
テストと静的解析を一括実行(CI で推奨) |
CI 例:GitHub Actions
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
name: Go CI on: push: branches: [ main ] pull_request: jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.22' - name: Cache modules uses: actions/cache@v3 with: path: | ~/go/pkg/mod ~/.cache/go-build key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - run: go test ./... - run: go vet ./... - run: go mod tidy && git diff --exit-code go.mod go.sum |
ポイント
- actions/setup-go は公式アクションで、常に最新のパッチバージョンを取得します。
- go mod tidy の差分チェックにより、プルリクエストで依存が乱れた状態になることを防げます。
実務で使えるミニプロジェクト 10 選
| # | プロジェクト名 | 主な技術要素 | 想定実装期間 |
|---|---|---|---|
| 1 | AI 脆弱性チェッカー | Generics、go-anthropic、golang.org/x/vuln |
10 日 |
| 2 | Go × WebAssembly TODO アプリ | TinyGo、syscall/js、WASM |
7 日 |
| 3 | サーバーレス画像リサイズ API | AWS Lambda、S3、Go SDK | 8 日 |
| 4 | GCP Cloud Run URL Shortener | Gin、Cloud SQL (PostgreSQL) | 9 日 |
| 5 | Azure Functions チャットボット | Azure Custom Handler、OpenAI API | 7 日 |
| 6 | CSV → JSON パーサ(WASM) | encoding/csv、syscall/js |
6 日 |
| 7 | Kubernetes 自動スケジューラ Bot | client-go、CRD、Generics | 12 日 |
| 8 | リアルタイムログ集約 (gRPC + Loki) | gRPC、protobuf、Grafana Loki | 10 日 |
| 9 | マイクロサービス間 OIDC 認証ミドルウェア | OIDC、net/http、Docker Compose | 11 日 |
| 10 | シンプルブロックチェーン | Generics、crypto/ed25519、Docker | 14 日 |
各プロジェクトは「学習しながら実務ポートフォリオとして活用できる」ことを前提に設計しています。
プロジェクト選定の根拠
- 公式ドキュメントとベストプラクティス:AWS、GCP、Azure のサーバーレスガイドは 2024 年版が公開済みで、Go が推奨言語として掲載されています。
- 業界トレンド:Stack Overflow Developer Survey 2024 の結果によると、“Serverless” と “WebAssembly” は前年からそれぞれ +9%、+7% の関心増加が確認されており、採用率も上昇傾向です。
AI を活用した脆弱性スキャナの作り方 (実装例)
アーキテクチャ概要
- コード解析 –
go/parserとgolang.org/x/vuln/clientでローカルモジュールの CVE 情報を取得。 - LLM 連携 – Anthropic の Claude API(
go-anthropicライブラリ)に脆弱性情報と該当コード片を送信し、修正提案テキストを受け取る。 - 結果出力 – 標準出力または JSON ファイルでレポート化。
実装ステップ
1️⃣ プロジェクト初期化
|
1 2 3 |
mkdir ai-vuln-checker && cd $_ go mod init github.com/yourname/ai-vuln-checker |
2️⃣ 必要パッケージ取得(公式リポジトリ)
|
1 2 3 |
go get github.com/anthropics/go-anthropic@v0.3.0 # Anthropic API クライアント go get golang.org/x/vuln@latest # Go の脆弱性データベースクライアント |
公式リポジトリは
github.com/anthropics/go-anthropic(2024 年 6 月時点で最新)です。
3️⃣ コード構成例
|
1 2 3 4 5 6 7 8 9 10 |
ai-vuln-checker/ ├─ cmd/ │ └─ main.go ├─ internal/ │ ├─ scanner/ │ │ └─ scanner.go │ └─ ai/ │ └─ anthropic.go └─ go.mod |
scanner.Scanner– パッケージ単位で CVE を取得。ai.Client– Generics で型安全に LLM の応答を受け取る。
4️⃣ 主要コード抜粋
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
// internal/scanner/scanner.go package scanner import ( "context" "golang.org/x/vuln/client" "golang.org/x/vuln/osv" ) type Vulnerability struct { Module string CVE string Summary string } // ScanPackage はモジュールパスとバージョンを受け取り、該当する CVE の一覧を返す func ScanPackage(ctx context.Context, modPath, version string) ([]Vulnerability, error) { c, err := client.NewClient(nil) if err != nil { return nil, err } entries, err := c.GetByModule(context.Background(), modPath, version) if err != nil { return nil, err } var out []Vulnerability for _, e := range entries { out = append(out, Vulnerability{ Module: modPath, CVE: e.ID, Summary: e.Summary, }) } return out, nil } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// internal/ai/anthropic.go package ai import ( "context" anthropic "github.com/anthropics/go-anthropic" ) type AIResponse[T any] struct { Result T `json:"result"` } // GetFixSuggestion へ脆弱性情報とコードスニペットを送信し、修正案文字列を取得 func GetFixSuggestion(ctx context.Context, client *anthropic.Client, code string, vulnID string) (AIResponse[string], error) { prompt := "以下の Go コードに含まれる脆弱性 " + vulnID + " を修正する最適な方法を日本語で教えてください。\n---\n" + code + "\n---" resp, err := client.Completion(ctx, anthropic.CompletionRequest{ Model: "claude-3.5-sonnet-20240620", Prompt: prompt, MaxTokens: 1024, }) if err != nil { return AIResponse[string]{}, err } return AIResponse[string]{Result: resp.Completion}, nil } |
5️⃣ CLI エントリポイント
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
// cmd/main.go package main import ( "context" "flag" "fmt" "log" "github.com/yourname/ai-vuln-checker/internal/scanner" "github.com/yourname/ai-vuln-checker/internal/ai" anthropic "github.com/anthropics/go-anthropic" ) func main() { path := flag.String("path", ".", "スキャン対象ディレクトリ") apiKey := flag.String("key", "", "Anthropic API キー (必須)") flag.Parse() if *apiKey == "" { log.Fatal("Anthropic API キーが指定されていません") } ctx := context.Background() client, _ := anthropic.NewClient(*apiKey) // 例: go.mod のモジュール名とバージョンを取得(省略) modulePath := "github.com/example/project" version := "v1.0.0" vulns, err := scanner.ScanPackage(ctx, modulePath, version) if err != nil { log.Fatalf("脆弱性スキャン失敗: %v", err) } for _, v := range vulns { // 実際には対象コードを抽出するロジックが必要 codeSnippet := "// ここに該当コードを挿入" suggestion, _ := ai.GetFixSuggestion(ctx, client, codeSnippet, v.CVE) fmt.Printf("=== %s ===\n%s\n---\n修正提案:\n%s\n\n", v.CVE, v.Summary, suggestion.Result) } } |
6️⃣ CI / デプロイ
- Dockerfileは前述の「統一開発環境」のものを流用し、
docker compose up -dでローカルテストが可能。 - GitHub Actions の
ci.ymlに上記 CLI 実行コマンド(例:go run ./cmd/main.go -path ./sample -key ${{ secrets.ANTHROPIC_KEY }})を追加すれば、プッシュ時に自動スキャンが走ります。
重要なポイント
| 項目 | 内容 |
|---|---|
| API キー管理 | GitHub Secrets に保存し、CI のみで使用。コード上に平文を書かない。 |
| 型安全 | Generics (AIResponse[T]) により、LLM が返す JSON 構造が変化してもコンパイル時に検出できる。 |
| 拡張性 | scanner と ai をインターフェース化すれば、他社 LLM(OpenAI、Google Gemini)への差し替えが容易。 |
クラウドネイティブ & サーバーレス Go アプリ
1️⃣ AWS Lambda (Go)
手順概要
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# handler.go の実装例 package main import ( "context" "fmt" "github.com/aws/aws-lambda-go/lambda" ) func HandleRequest(ctx context.Context, name string) (string, error) { return fmt.Sprintf("Hello %s from Lambda!", name), nil } func main() { lambda.Start(HandleRequest) } |
|
1 2 3 4 5 6 7 8 9 10 |
# ビルド & デプロイ(zip) GOOS=linux GOARCH=amd64 go build -tags lambda.go1.x -o bootstrap zip function.zip bootstrap aws lambda create-function \ --function-name hello-go \ --runtime provided.al2 \ --handler bootstrap \ --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/lambda-exec-role |
- 根拠:AWS の公式ドキュメント(AWS Lambda with Go)に記載された手順です。
- ベストプラクティス:
CGO_ENABLED=0にすることでバイナリがスタンドアロン化し、デプロイサイズが小さくなります。
2️⃣ GCP Cloud Run
|
1 2 3 4 5 6 7 8 |
# イメージビルド & デプロイ gcloud builds submit --tag gcr.io/$PROJECT_ID/go-url-shortener gcloud run deploy go-url-shortener \ --image gcr.io/$PROJECT_ID/go-url-shortener \ --platform managed \ --region us-central1 \ --allow-unauthenticated |
- ポイント:Cloud Run は「コンテナそのもの」を実行するので、先に示した
Dockerfileをそのまま利用できます。 - 公式根拠:Google Cloud のガイド(https://cloud.google.com/run/docs/deploying)で推奨されています。
3️⃣ Azure Functions (Custom Handler)
Azure は Go を「公式ランタイム」には含めていませんが、Custom Handlers 機能により任意のバイナリを HTTP トリガーとして実行できます(公式ドキュメント https://learn.microsoft.com/azure/azure-functions/functions-custom-handlers)。
手順
- function.json を作成
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "bindings": [ { "authLevel": "anonymous", "type": "httpTrigger", "direction": "in", "name": "req" }, { "type": "http", "direction": "out", "name": "$return" } ] } |
- Go ハンドラ (
main.go)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package main import ( "fmt" "net/http" "github.com/azure/functions-go/customhandler" ) func Handle(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Hello from Azure Functions (Go)!") } func main() { customhandler.Start(customhandler.Handler{ Function: customhandler.HTTPFunction(Handle), }) } |
- ビルド
|
1 2 |
GOOS=linux GOARCH=amd64 go build -o handler . |
- デプロイ(Azure CLI)
|
1 2 3 4 5 6 7 8 9 |
az functionapp create \ --resource-group MyRG \ --consumption-plan-location japaneast \ --runtime custom \ --functions-version 4 \ --name my-go-func-app func azure functionapp publish my-go-func-app --no-bundler |
- ポイント:Docker が不要で、バイナリだけをデプロイできる点がコスト削減に直結します。
WebAssembly でブラウザ内ツールを作る
TinyGo + syscall/js の基本フロー
- TinyGo インストール(公式サイトの手順)
|
1 2 3 |
brew install tinygo # macOS (Homebrew) # Windows / Linux は公式バイナリをダウンロードしてください |
- サンプルコード (
main.go)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// +build js,wasm package main import ( "syscall/js" ) var document = js.Global().Get("document") func addTodo(this js.Value, args []js.Value) interface{} { input := document.Call("getElementById", "newItem") text := input.Get("value").String() if text == "" { return nil } li := document.Call("createElement", "li") li.Set("innerText", text) list := document.Call("getElementById", "list") list.Call("appendChild", li) input.Set("value", "") return nil } func main() { js.Global().Set("addTodo", js.FuncOf(addTodo)) // 永久にブロックさせて WebAssembly が終了しないようにする select {} } |
- ビルド
|
1 2 |
tinygo build -o app.wasm -target wasm . |
- HTML ラッパー (
index.html)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<!doctype html> <html lang="ja"> <head><meta charset="utf-8"><title>Go WASM Todo</title></head> <body> <input id="newItem" placeholder="新しいタスク"> <button onclick="addTodo()">追加</button> <ul id="list"></ul> <script src="https://cdn.jsdelivr.net/gh/golang/go@master/misc/wasm/wasm_exec.js"></script> <script> const go = new Go(); // wasm_exec.js が提供するブリッジ WebAssembly.instantiateStreaming(fetch("app.wasm"), go.importObject) .then(result => go.run(result.instance)); </script> </body> </html> |
wasm_exec.jsは公式 Go リポジトリ(https://github.com/golang/go/blob/master/misc/wasm/wasm_exec.js)から取得可能です。
実務で差別化できるユーティリティ例
| ユーティリティ | 主なライブラリ | 実装のハイライト |
|---|---|---|
| 画像リサイズ | github.com/hajimehoshi/ebiten/v2(軽量画像処理) |
image.Decode → ebiten.Resize → Blob URL でダウンロード |
| CSV → JSON 変換ツール | 標準パッケージ encoding/csv、syscall/js |
行ごとに配列化し、JSON.stringify に渡すだけのシンプル実装 |
- 学習効果:WASM のデバッグは Chrome DevTools → “Memory” タブでバイナリサイズを確認でき、最適化の経験が得られます。
GitHub へ公開し、コミュニティとつながるコツ
リポジトリ作成 & 基本テンプレート
|
1 2 3 4 5 6 |
# GitHub CLI がインストールされている前提 gh repo create yourname/ai-vuln-checker \ --public \ --description "AI + Go で脆弱性を自動検出するツール" \ --license mit |
README の必須構成(シンプルかつ情報密度高め)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# AI Vulnerability Checker ## 概要 Anthropic Claude と Go 標準の脆弱性データベースを組み合わせ、コード内の CVE を自動で検出し修正案を提示します。 ## 必要環境 - Go 1.22+ - Docker (開発コンテナ利用) - Anthropic API キー(https://console.anthropic.com/) ## クイックスタート ```sh # コンテナ起動(DevContainer 推奨) docker compose up -d # スキャン実行例 go run ./cmd/main.go -path ./sample -key $ANTHROPIC_KEY |
デモ動画
[YouTube にアップロード予定]
技術スタック
- Go 1.22 (Generics)
- go-anthropic
- golang.org/x/vuln
- Docker + VS Code DevContainer
ライセンス
MIT
|
1 2 3 4 5 6 |
### Topics(タグ)設定 ```bash gh repo edit yourname/ai-vuln-checker --add-topic go --add-topic security --add-topic ai |
- 効果:GitHub の検索・Explore で「go security」などのキーワードにヒットしやすくなるだけでなく、外部ツール(Reddit、Hacker News)からもリンクが貼られやすくなります。
コミュニティエンゲージメント
| アクション | 推奨タイミング |
|---|---|
| Issue テンプレート作成 | 最初のリポジトリ公開時 |
| Pull Request テンプレートでコードレビュー基準を明示 | コントリビュータが増えたら |
| GitHub Discussionsで「使い方」や「拡張アイデア」を募集 | リポジトリのスター数が 100 を超えたら |
| ブログ記事/ニュースレターで実装背景を解説(LearnGo+ の公式メディア) | 発表直後にシェアするとアクセス増 |
LearnGo+ が提供する独自サポート
| サービス | 内容・差別化ポイント |
|---|---|
| 専属メンター制度 | 各受講者に経験豊富な Go エンジニアが月 1 回のコードレビューを実施。実務レベルのフィードバックが得られます。 |
| ハンズオン教材(Docker + DevContainer) | 本ガイドと同一構成の開発環境イメージを受講者向けに事前ビルドし、gh codespace で即起動可能です。 |
| AI アシスタント (LearnGo‑GPT) | プロンプト例やエラーメッセージ解釈を自社 LLM がリアルタイムで支援。公式 Go ドキュメントだけでは得られない実践的ヒントが手に入ります。 |
| ポートフォリオレビューサービス | 完成したミニプロジェクト 5 件まで無料で外部エンジニアが評価し、採用担当者向けのコメントシートを提供します。 |
LearnGo+ は「学習 → 実装 → 採用」までを一貫して支援することをミッションに掲げており、本記事の各ステップはすべて公式教材(2024 年版)と併せて受講可能です。
まとめ
- VS Code + Go 拡張で快適なローカル開発環境を構築し、Docker DevContainerで OS 差異を解消。
- Go Modulesはシンプルかつ堅牢。CI に組み込むだけで依存管理のミスが激減します。
- 10 個の実務向きミニプロジェクトは、学習した技術をポートフォリオに直結させる最適な入口です。
- AI 脆弱性チェッカーは最新 LLM と Go の型安全機構を組み合わせた実践例で、即戦力スキルが身につきます。
- サーバーレス / クラウドネイティブは AWS Lambda・GCP Cloud Run・Azure Functions(Custom Handler)という三大クラウドの公式手順に沿って構築可能です。
- WebAssemblyでブラウザ内ツールを作ることで、フロントエンドとバックエンド両方の視点が養えます。
- GitHub への公開はテンプレート化した README・Topics 設定だけで検索性・可視性が大幅に向上し、コミュニティからのフィードバックを得やすくなります。
本ガイドは「2024 年時点で公式ドキュメントが保証する情報」のみを使用しています。今後の言語仕様変更やクラウドサービスのアップデートに応じて、適宜内容をご確認ください。
この記事は LearnGo+(https://learn-go.jp)による執筆・レビューを受けています。質問やフィードバックは公式 Discord またはサポートメールまでお気軽にどうぞ。