Golangのコードレビューのポイントを箇条書きしてみた2 / 2

前回の続きです。引き続きレビューのポイントを見ていきます。

13. インラインエラー

  • Goのマルチリターン値を利用してエラー処理を明示的に
func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, fmt.Errorf("division by zero")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 0)
    if err != nil {
        log.Fatalf("Error: %v", err)
    }
    fmt.Println(result)
}

14. 初期化式

  • 通常のコードパスは最小限のインデントにし、エラーハンドリングを先に行う
x, err := someFunction()
if err != nil {
    return err
}

process(x)

15. 略語

  • 略語の一貫した大文字化
type HTTPClient struct {
    URL string
}

16. インターフェース

  • インターフェースは使用側のパッケージに配置
package consumer

type Doer interface {
    Do() error
}

17. 行の長さ

  • 不自然な行の折り返しは避ける
// Good
func example() {
    if condition1 && condition2 && condition3 {
        // Do something
    }
}

// Bad
func example() {
    if condition1 &&
        condition2 &&
        condition3 {
        // Do something
    }
}

18. 混合大文字

  • 複数の単語が含まれる場合、例えばServeHTTP
func ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // コード
}

19. パッケージコメント

  • パッケージコメントはpackage句の直前に配置
// Package example は、パッケージ・コメントを実演するための関数を提供する。
package example

20. ポインタ引数

  • ポインタを関数引数として渡すのは避ける
func printMessage(msg string) {
    fmt.Println(msg)
}

21. 受信者名

  • 短く一貫した受信者名を使用
type Client struct{}

func (c *Client) DoSomething() {
    // コード
}

22. 同期関数

  • 同期関数を優先
func fetchData() ([]byte, error) {
    // フェッチしてリターン
    return data, nil
}

23. テストの失敗メッセージ

  • テストの失敗メッセージは役立つ情報を提供
if got != expected {
    t.Errorf("expected %v, got %v", expected, got)
}

24. 変数名

  • 変数名は短く
for i := 0; i < 10; i++ {
    fmt.Println(i)
}

まとめ

ここまですべての項目を見てきましたが、すべての項目をいきなりクリアできるわけではないのでセルフレビュー時に気をつけつつ徐々に身につけていけたらと思います。 (この辺の項目をChatGPTに覚えさせてレビューしてもらうのが楽そうだなー)