GoogleのGo Style Guideを理解して楽しくGolang！ ～3つのガイド 説明編～

## はじめに


最近業務でチーム開発をする中で、コード「可読性」や「一貫性」を保つことが大事だと実感しています。

ベテランエンジニアの方々は、これらを無意識に担保できると思いますが、Goを始めたばかりの私たちにとっては「どこまで意識すればいいのか」「何を気をつけるべきか」がわからないことも多いですよね。そこで今回は、**Googleが提示する3つのガイド**に注目してまとめていきます！

## 📚 目次
1. [Go Style Guideについて](#go-style-guideについて)
   - 概要
   - 構成
2. [Go Style Guideの3種類](#go-style-guideの3種類)
   - Style Decisions
   - Style Guide
   - Best Practices
3. [まとめ](#まとめ)

---

## Go Style Guideについて

### 概要

GoogleのGoスタイルガイドは、**読みやすく慣用的なGoコードを書くためのベストアプローチ**を整理したドキュメントです。このガイドは、特に**初心者が陥りがちなミスを防ぎ、可読性と一貫性の高いコードを書く**ための指針を提供しています。ただし、ガイドラインに完全に従うことが絶対ではなく、状況に応じて柔軟に使うことが推奨されています。

このガイドの目的は以下の通りです：

- **Goスタイルの原則と解決策を共有**し、開発者間で一貫したルールを確立する  
- **Goイディオムの正しい例**を示し、チーム開発時の迷いを減らす  
- コードレビュー時に**無駄な議論を減らす**  

特に、Googleのコードベースやレビュー文化で活用されており、規模に関わらず**良い判断と実践的な助け**を提供しています。

**👉 [公式リンク: Go Style](https://google.github.io/styleguide/go/)**


---

### 構成

Goスタイルガイドは以下の3つの文書で構成されており、それぞれ異なる目的と対象に向けた内容です。

| 文書名              | 主な目的                            | 主な対象               | 規範性の説明 |
|------------------|--------------------------------|-------------------|-----------|
| **Style Guide**     | Goの基本的なコーディングスタイルを解説        | 全Goエンジニア          | **強いガイドライン**: ほぼすべてのGoコードで遵守すべき基本的なルールを定めています。従うことが推奨されます。 |
| **Style Decisions** | スタイルに関する判断基準を示す | チーム開発者やレビュー担当者 | **強いガイドライン**: 特にスタイルに迷った際の判断基準を示しており、選択肢を絞るための指針として活用するべきです。 |
| **Best Practices**   | 実践的な設計・実装の推奨例を提供             | 中級～上級者            | **参考として使用**: 絶対的なルールではなく、シチュエーションに応じて柔軟に活用するべき実践的なアドバイスが含まれています。 |

GoogleのGo Style Guideは、以下の3つに分かれており、それぞれが異なる視点からコーディングのルールやベストプラクティスを提供しています。用途に応じて使い分けることが大切ですね。

---

## Go Style Guideの3種類

### 1. **Style Decisions**  
**「迷ったときの判断基準」を示すガイド**です。  

開発中、「どっちのスタイルが正しい？」「Goらしい設計はこれで合っている？」と悩んだこと、ありませんか？特にチームで開発していると、スタイルがバラバラだとコードレビューが大変になりますよね。Style Decisionsは、そんな迷いを解決するための具体的な指針を提供しています。

**👉 [公式リンク: Style Decisions](https://google.github.io/styleguide/go/decisions)**

#### 具体例（命名規則）：

Goでは、名前に関するルールが重要です。このガイドは、コアスタイルガイドで定められた命名規則をさらに詳しく説明し、特定のケースでの例外や補足を紹介しています。

- **原則：名前にアンダースコア（`_`）は使わない**  
  Goでは名前にアンダースコアを使わないのが基本。ただし、以下のような特定のケースでは使用が許可されています。

  1. **生成されたコード専用のパッケージ名**  
     自動生成されたコードでのみ使用されるパッケージ名にはアンダースコアを含めてもOKです。

     ```go
     package my_generated_package 
     ```

  2. **テスト、ベンチマーク、例示用関数名**  
     `_test.go` ファイル内のテスト関数やベンチマーク関数、例示関数で使うのは問題ありません。

     ```go
     func Test_myFunction_works(t *testing.T) {
         // テストコード
     }
     ```

  3. **低レベルのOSやcgoとの連携ライブラリ**  
     OSやcgoとの連携で識別子を再利用する場合、アンダースコアの使用が許されることがあります。

     ```go
     import "syscall"

     func Example_syscallFunction() {
         syscall.Some_System_Call()
     }
     ```

---

### 2. **Style Guide**  
**Goの基本的なコーディングスタイルを網羅したガイド**です。  

Goらしいコードを書くための基本ルールが書かれています。このガイドを守ると、Goの公式ツールやコミュニティでの標準的なスタイルに準拠したコードが書けるようになります。

**👉 [公式リンク: Style Guide](https://google.github.io/styleguide/go/)**

#### **スタイルの原則** :  

Go Style Guideでは、特に重視されている5つの原則があります（優先順位順）：
1. **Clarity（明確性）**  
   コードの目的と意図が明確であること。
2. **Simplicity（簡潔性）**  
   目的を最もシンプルに達成していること。
3. **Concision（簡略性）**  
   不要な情報を省き、信号対雑音比を高めること。
4. **Maintainability（保守性）**  
   将来の変更や拡張が容易であること。
5. **Consistency（一貫性）**  
   Googleのコードベース全体と整合性を保つこと。

---

### 3. **Best Practices**  
**「Goのベストプラクティス」をまとめたガイド**です。

Goにおけるベストプラクティスは、一般的な課題に対する最良のアプローチを示しています。このガイドでは、コードの可読性やメンテナンス性を高めるための推奨事項が提供されています。ただし、すべてのケースに当てはまるわけではないので、状況に応じて柔軟に使うことが求められます。

**👉 [公式リンク: Best Practices](https://google.github.io/styleguide/go/best-practices)**

#### 具体例（関数・メソッド名の命名）：

関数やメソッドの命名においては、コードを呼び出す場所での読みやすさを重視することが大切です。冗長性を避けるためのアドバイスを紹介します。

- **入力と出力の型は名前に含めない**  
  型の情報は関数名に含めず、関数を使用する文脈で十分に理解できるようにします。

  ```go
  // Bad:
  // 関数名に型情報（YAMLのパース）が含まれている
  func ParseYAMLConfig(input string) (*Config, error) {
      // YAMLの設定ファイルをパースする処理
  }
   ```

   ``` go
  // Good:
  // 関数名から型の情報を省略し、処理内容にフォーカスする
  func Parse(input string) (*Config, error) {
      // YAMLの設定ファイルをパースする処理
  }
  ```

## まとめ

GoogleのGo Style Guideは、初心者からベテランまで、すべてのGoエンジニアにとって有益なガイドラインです。私も勉強中ではありますが、**Style Guide**と**Style Decisions**を中心に、**Best Practices**を補助的に活用しつつ、チーム開発を進めています。

この記事が、Go言語を学ぶ際の参考になれば嬉しいです！次回は、**Style Guide**の具体的な内容をさらに詳しく見ていきたいと思います！

## 📝 関連リンク
- [Go Style](https://google.github.io/styleguide/go/)
- [Style Decisions](https://google.github.io/styleguide/go/decisions)  
- [Style Guide](https://google.github.io/styleguide/go/)  
- [Best Practices](https://google.github.io/styleguide/go/best-practices)