# Go Linting 配置說明

本項目使用現代化的 Go linting 工具來確保代碼質量和風格一致性。

## 工具介紹

### golangci-lint
- **現代化的 Go linter 聚合工具**，整合了多個 linter
- 比傳統的 `golint` 更快、更全面
- 支持並行執行和緩存
- 配置文件：`.golangci.yml`

## 安裝

### 安裝 golangci-lint

```bash
# macOS
brew install golangci-lint

# Linux
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.55.2

# Windows
go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.55.2
```

### 安裝其他工具

```bash
# 格式化工具
go install mvdan.cc/gofumpt@latest
go install golang.org/x/tools/cmd/goimports@latest
```

## 使用方法

### Makefile 命令

```bash
# 基本代碼檢查
make lint

# 自動修復可修復的問題
make lint-fix

# 詳細輸出
make lint-verbose

# 只檢查新問題（與 main 分支比較）
make lint-new

# 格式化代碼
make fmt
```

### 直接使用 golangci-lint

```bash
# 基本檢查
golangci-lint run

# 自動修復
golangci-lint run --fix

# 檢查特定目錄
golangci-lint run ./pkg/...

# 詳細輸出
golangci-lint run -v

# 只顯示新問題
golangci-lint run --new-from-rev=main
```

## 配置說明

### 啟用的 Linters

我們的配置啟用了以下 linter 類別：

#### 核心檢查
- `errcheck`: 檢查未處理的錯誤
- `gosimple`: 簡化代碼建議
- `govet`: 檢查常見錯誤
- `staticcheck`: 靜態分析
- `typecheck`: 類型檢查
- `unused`: 檢查未使用的變量和函數

#### 代碼質量
- `cyclop`: 循環複雜度檢查
- `dupl`: 代碼重複檢測
- `funlen`: 函數長度檢查
- `gocognit`: 認知複雜度檢查
- `gocyclo`: 循環複雜度檢查
- `nestif`: 嵌套深度檢查

#### 格式化
- `gofmt`: 格式化檢查
- `gofumpt`: 更嚴格的格式化
- `goimports`: 導入排序

#### 命名和風格
- `goconst`: 常量檢查
- `gocritic`: 代碼評論
- `gomnd`: 魔術數字檢查
- `stylecheck`: 風格檢查
- `varnamelen`: 變量名長度檢查

#### 安全
- `gosec`: 安全檢查

#### 錯誤處理
- `errorlint`: 錯誤處理檢查
- `nilerr`: nil 錯誤檢查
- `wrapcheck`: 錯誤包裝檢查

### 配置文件結構

```yaml
# .golangci.yml
run:
  timeout: 5m
  skip-dirs: [vendor, .git, bin, build, dist, tmp]
  skip-files: [".*\\.pb\\.go$", ".*\\.gen\\.go$"]

linters:
  disable-all: true
  enable: [errcheck, gosimple, govet, ...]

linters-settings:
  # 各個 linter 的詳細配置
  
issues:
  # 問題排除規則
  exclude-rules:
    - path: _test\.go
      linters: [gomnd, funlen, dupl]
```

## IDE 整合

### VS Code
項目包含 `.vscode/settings.json` 配置：
- 自動使用 golangci-lint 進行檢查
- 保存時自動格式化
- 使用 gofumpt 作為格式化工具

### GoLand/IntelliJ
1. 安裝 golangci-lint 插件
2. 在設置中指向項目的 `.golangci.yml` 文件

## CI/CD 整合

### GitHub Actions
項目包含 `.github/workflows/ci.yml`：
- 自動運行測試
- 執行 golangci-lint 檢查
- 安全掃描
- 依賴檢查

### 本地 Git Hooks
可以設置 pre-commit hook：

```bash
#!/bin/sh
# .git/hooks/pre-commit
make lint
```

## 常見問題

### 1. 如何忽略特定的檢查？

在代碼中使用註釋：
```go
//nolint:gosec // 忽略安全檢查
password := "hardcoded"

//nolint:lll // 忽略行長度檢查
url := "https://very-long-url-that-exceeds-line-length-limit.com/api/v1/endpoint"
```

### 2. 如何為測試文件設置不同的規則？

配置文件中已經為測試文件設置了特殊規則：
```yaml
exclude-rules:
  - path: _test\.go
    linters: [gomnd, funlen, dupl, lll, goconst]
```

### 3. 如何調整複雜度閾值？

在 `.golangci.yml` 中調整：
```yaml
linters-settings:
  cyclop:
    max-complexity: 15  # 調整循環複雜度
  funlen:
    lines: 100          # 調整函數行數限制
    statements: 50      # 調整語句數限制
```

### 4. 性能優化

- 使用緩存：`golangci-lint cache clean` 清理緩存
- 只檢查修改的文件：`--new-from-rev=main`
- 並行執行：默認已啟用

## 升級和維護

定期更新 golangci-lint：
```bash
# 檢查版本
golangci-lint version

# 升級到最新版本
brew upgrade golangci-lint  # macOS
# 或重新下載安裝腳本
```

定期檢查配置文件的新選項和 linter：
```bash
# 查看所有可用的 linter
golangci-lint linters

# 查看配置幫助
golangci-lint config -h
```

## 參考資源

- [golangci-lint 官方文檔](https://golangci-lint.run/)
- [Go 代碼風格指南](https://github.com/golang/go/wiki/CodeReviewComments)
- [Effective Go](https://golang.org/doc/effective_go.html)
