はじめに
go.dev
CodeReviewCommentsというページがありまして、これはGo言語のよくある指摘をまとめたもの
集みたいなもので、実装において参考になりそうなのでまとめてみます。
24個と結構多いので2回に分けて投稿します。
レビューする際にも適用できますし、何より自分が実装する際において品質を上げることができるので、できるだけ押さえておきたいところです。
コードレビューのポイント
1. Gofmt
gofmt
を使用してスタイルの問題を自動的に修正goimports
でインポート行の追加・削除も自動化
2. コメントの書き方
- 宣言をドキュメントするコメントは完全な文で
- コメントは対象の名前で始め、ピリオドで終わる
// Request represents a request to run a command. type Request struct { // コマンドは〇〇〜。 Command string }
3. Contexts
context.Context
型を第一引数にする- カスタムContext型やインターフェースは避ける
func DoSomething(ctx context.Context, param string) error { // コード return nil }
4. 構造体のコピー
- 他のパッケージからの構造体をコピーする際は注意
package main import "bytes" func CopyBuffer(buf *bytes.Buffer) bytes.Buffer { return *buf // これにより、元のバッファとコピーされたバッファが同じデータを参照する可能性があります }
5. 暗号用乱数
math/rand
ではなく、crypto/rand
を使用する
import ( "crypto/rand" "fmt" ) func GenerateKey() string { buf := make([]byte, 16) _, err := rand.Read(buf) if err != nil { panic(err) } return fmt.Sprintf("%x", buf) }
6. 空スライスの宣言
var t []string
を推奨
var t []string // t = []string{} も正しいが、あまり好まれない
7. ドキュメントコメント
- トップレベルのエクスポートされた名前にはドキュメントコメントを付ける
// パッケージ math は基本的な定数と数学の関数を提供する。 package math
8. Panicの使用
- 通常のエラーハンドリングに
panic
を使用しない
func divide(a, b int) (int, error) { if b == 0 { return 0, fmt.Errorf("division by zero") } return a / b, nil }
9. エラーストリング
- エラーストリングは大文字で始めず、句読点で終わらない
if err != nil { return fmt.Errorf("failed to open file: %w", err) }
10. ゴルーチンの寿命
- ゴルーチンの寿命が明確になるようにする
func worker(done chan bool) { // Do some work done <- true } func main() { done := make(chan bool, 1) go worker(done) <-done }
11. エラーハンドリング
- エラーを無視せず、適切に処理する
file, err := os.Open("file.txt") if err != nil { log.Fatalf("failed to open file: %s", err) } defer file.Close()
12. インポート
- 名前の競合を避けるためにのみインポートの名前を変更
import ( "fmt" "math/rand" myrand "myproject/rand" )
まとめ
個人的に2が参考になりました。あまり主語で始まるコメントを書いていなかったため気をつけていきたいです。 次回は13個目からまとめていきます。