# 機能設計書 45-Go

## 概要

本ドキュメントは、space-vimにおけるGo言語サポート機能の設計仕様を定義する。本機能はvim-goプラグインを統合し、Goファイル編集時のビルド、テスト、フォーマット、コード補完、ドキュメント参照等の包括的な開発支援機能を提供する。

### 本機能の処理概要

本機能は、Goファイル（.go）の編集時に、IDE相当の開発支援機能を提供する。vim-goプラグインを中心として、Go言語の開発に必要なツールチェーン（gofmt、goimports、godef、guru等）との統合を実現する。

**業務上の目的・背景**：GoはGoogle発のシステムプログラミング言語であり、クラウドインフラ、マイクロサービス、CLI ツール開発で広く採用されている。Vim上でのGo開発を効率化し、標準的なGoのコーディングスタイルを強制することで、チーム開発における一貫性とコード品質の向上を実現する。

**機能の利用シーン**：
- Goパッケージ・モジュールの作成・編集
- go build / go test の実行
- gofmt/goimportsによる自動フォーマット
- 定義ジャンプ・リファレンス検索
- Tagbarによるシンボル一覧表示

**主要な処理内容**：
1. Goファイルタイプ検出時のvim-go遅延読み込み
2. GoInstallBinariesによるツールチェーンのインストール
3. 構文ハイライト強化設定の適用
4. Tagbar用のGoシンボル設定
5. gotagsとの連携によるタグ生成

**関連システム・外部連携**：
- fatih/vim-go プラグイン
- Goツールチェーン（gofmt、goimports、godef、guru、gotags等）
- Tagbar（シンボル一覧表示）

**権限による制御**：特になし（全ユーザー共通機能）

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 6 | Tagbar（タグバー） | 参照画面 | Goシンボル（関数、型、変数等）の一覧表示 |
| 8 | 補完ポップアップ | 参照画面 | Goコードの補完候補表示 |
| 17 | Quickfix/Location List | 結果表示画面 | ビルドエラー・テスト結果の表示 |

## 機能種別

言語サポート / ビルド / テスト / フォーマット / 補完 / ナビゲーション

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| g:go_highlight_types | Number | No | 型のハイライト有効化 | 0または1 |
| g:go_highlight_fields | Number | No | フィールドのハイライト有効化 | 0または1 |
| g:go_highlight_methods | Number | No | メソッドのハイライト有効化 | 0または1 |
| g:go_highlight_operators | Number | No | 演算子のハイライト有効化 | 0または1 |
| g:go_highlight_functions | Number | No | 関数のハイライト有効化 | 0または1 |
| g:go_highlight_build_constraints | Number | No | ビルド制約のハイライト有効化 | 0または1 |
| g:go_gotags_bin | String | No | gotagsバイナリのパス | 実行可能パス |

### 入力データソース

- Goソースファイル（.go）
- go.mod / go.sum（モジュール管理）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 構文ハイライト | Highlight | Go構文の強化された色分け表示 |
| 補完候補 | List | Go識別子の補完候補 |
| ビルド結果 | List | コンパイルエラーの一覧 |
| テスト結果 | List | テスト実行結果の一覧 |
| タグ情報 | List | Tagbar用シンボル情報 |

### 出力先

- エディタバッファ（構文ハイライト）
- 補完ポップアップウィンドウ
- Quickfix/Location List（ビルド・テスト結果）
- Tagbarウィンドウ（シンボル一覧）

## 処理フロー

### 処理シーケンス

```
1. Goファイルオープン
   └─ ファイルタイプ検出

2. vim-go プラグイン読み込み判定
   └─ speed_up_via_timer による遅延読み込み or 即時読み込み

3. User vim-go autocmd 発火
   └─ spacevim#autocmd#go#Init() 呼び出し

4. 構文ハイライト設定適用
   └─ g:go_highlight_* 変数設定

5. Tagbar設定適用
   └─ g:tagbar_type_go 設定

6. 開発ツール利用可能
   └─ :GoBuild, :GoTest, :GoFmt 等
```

### フローチャート

```mermaid
flowchart TD
    A[Goファイルオープン] --> B{speed_up_via_timer?}
    B -->|Yes| C[遅延読み込み登録]
    B -->|No| D[即時読み込み]
    C --> E[User vim-go イベント]
    D --> E
    E --> F[spacevim#autocmd#go#Init]
    F --> G[ハイライト設定適用]
    G --> H[Tagbar設定適用]
    H --> I[開発ツール利用可能]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-45-01 | 遅延読み込みルール | speed_up_via_timer設定時はgoファイルタイプ検出まで読み込みを遅延 | プラグイン登録時 |
| BR-45-02 | ツールインストールルール | vim-go初回ロード時にGoInstallBinariesを実行 | do設定 |
| BR-45-03 | Tagbar連携ルール | goレイヤー有効時にTagbar用のGo設定を適用 | Init時 |

### 計算ロジック

該当なし

## データベース操作仕様

### 操作別データベース影響一覧

本機能はデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | Goツール未インストール | goコマンドが見つからない | Go SDKのインストール案内 |
| - | gotagsビルドエラー | goタグツールのビルド失敗 | 手動でのツールビルド案内 |

### リトライ仕様

該当なし

## トランザクション仕様

該当なし

## パフォーマンス要件

- vim-goの遅延読み込みにより起動時間を最適化
- gotagsによる非同期タグ生成

## セキュリティ考慮事項

- 外部ツール（gofmt、godef等）はローカル環境のものを使用
- サードパーティモジュールの自動取得は信頼できるソースからのみ

## 備考

- :GoInstallBinaries で必要なツールを一括インストール可能
- gotags の設定により Tagbar でGoシンボルの階層表示が可能

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: プラグイン登録を理解する

vim-goプラグインの登録方法を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | packages.vim | `layers/+lang/go/packages.vim` | プラグイン登録と遅延読み込み設定 |

**読解のコツ**: `g:spacevim.speed_up_via_timer` の値により読み込みタイミングが変わる。

**主要処理フロー**:
1. **1-5行目**: 条件付きvim-go登録（遅延 or 即時）
2. **2行目**: `{ 'on': [], 'do': ':GoInstallBinaries' }` - 遅延読み込みとツールインストール
3. **6行目**: `autocmd! User vim-go` でInit関数を呼び出し

#### Step 2: 初期化処理を理解する

vim-goロード後の初期化処理を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | go.vim | `core/autoload/spacevim/autocmd/go.vim` | 初期化関数の実装 |

**主要処理フロー**:
- **1-12行目**: `s:ctagsbin()` - gotagsバイナリパス取得
- **14-48行目**: `spacevim#autocmd#go#Init()` - 初期化処理
- **15-20行目**: ハイライト設定（types, fields, methods, operators, functions, build_constraints）
- **21-47行目**: Tagbar用のGo設定

#### Step 3: 遅延読み込み処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | defer.vim | `core/autoload/spacevim/defer.vim` | 遅延読み込み実装 |

**主要処理フロー**:
- **77-79行目**: `spacevim#defer#go()` 関数でvim-go読み込み

### プログラム呼び出し階層図

```
Goファイルオープン
    │
    ├─ layers/+lang/go/packages.vim
    │      ├─ 条件判定（speed_up_via_timer）
    │      ├─ vim-go 登録（遅延 or 即時）
    │      └─ autocmd User vim-go 設定
    │
    ├─ vim-go ロード後
    │      └─ User vim-go イベント発火
    │             └─ spacevim#autocmd#go#Init()
    │
    └─ core/autoload/spacevim/autocmd/go.vim
           ├─ s:ctagsbin() - gotagsパス取得
           ├─ g:go_highlight_* 設定
           └─ g:tagbar_type_go 設定
```

### データフロー図

```
[入力]                    [処理]                         [出力]

Goソースコード ─────▶ vim-go 読み込み ──────▶ ハイライト表示
     │                      │
     ├─────────────────▶ :GoBuild ─────────▶ Quickfix表示
     │                      │
     ├─────────────────▶ :GoTest ──────────▶ テスト結果
     │                      │
     └─────────────────▶ gotags ───────────▶ Tagbar表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| packages.vim | `layers/+lang/go/packages.vim` | 設定 | vim-goプラグイン登録 |
| config.vim | `layers/+lang/go/config.vim` | 設定 | Go設定（空ファイル） |
| go.vim | `core/autoload/spacevim/autocmd/go.vim` | ソース | 初期化・Tagbar設定 |
| defer.vim | `core/autoload/spacevim/defer.vim` | ソース | 遅延読み込み処理 |
