背景
Goでコードを書く時に無意識で気をつけていることを、コードレビュー時に指摘することが多い。
書き出してみると結構な量になるのでまとめておきます。
実行効率と可読性を考えて試行錯誤を続けてきたノウハウを書いて、自分のコーディングルールを作る参考になればと願う所存である。
なお、どの言語でも共通のことにはあまり触れません。
基本編
1. go fmt, go lint, go import, go vetに逆らわない
これは本当に基本です。vscodeを使用していて、保存時に自動的に解析して直してくれます。
go lint
一例ですが以下を指摘してくれます。
- キャメルケース,
- idがあればIDの大文字で書く、
- グローバルな変数やメソッドにはコメントをつける。
- ErrFooと書くべきでFooErrと書いてはいけない
lintのレベルを設定できるので、プロジェクトのはじめにきつめの設定をすることをお勧めします。
go import
足りないimportを自動で読み込んだり削除します。
go vet
動くけどおかしな書き方を指摘してくれます。例えば途中リターンが含まれる場合や。無駄なelse文など
->細かくはこちら
go vetの使い方(go vetとは)
2. struct宣言時には必ずフィールドを書くこと
goではstructのフィールドの省略ができるが決してしてはいけない。
仮にhogeのフィールドの1行目にhageが追加された時、wrongPatternの場合はfuga,chigeの代入で無くなってしまう。
type hoge struct {
fuga int
chige int
}
wrongPattern := hoge{1, 0} // これでも動く
correct := hoge{fuga: 1, chige: 0} // こう書くべき
3. 引数や戻り値が多い時はまとめる
例えばこういうコードがあったとき
func hoge(a int, b int, c int) (d int, e int, f int) {
以下のように引数をまとめる
func hoge(a, b, c int) (d, e, f int) {
応用編
1. メソッドの引数をポインタにするときは明確に理由を持つ
- メソッドが引数の値を変更するとき。
- 画像などサイズの大きい引数のとき
2. メソッドの戻り値は基本的にポインタにしない。
func pattern1() (int) {return 0}
func pattern2() (out int) {return }
func pattern3() (out *int) {return }
上記のような書き方があるが基本的にpattern2を使用する
ポインタにしなくてもpattern2は参照を返している(以下リンクを参照)
https://medium.com/eureka-engineering/named-return-values-7f485d867df0
例外として気にすべきは参照を引き回して欲しいことを明示する時ぐらいだと思う。
3. 変数名の省略
変数の生存区間が長いものはより正確名前で書き、短いものは1文字の省略にしても良い。
// これはnでも明確
func inclimentNum(n int) (out int){
out = n + 1
return
}
// こちらは、100行後にnやsと書かれているとなんのことかわからなくなる
func enctyptNum(inputNum, seed int) (encryptString string){
// 100行くらいのコード
encryptString = getEncrptString(inputNum, seed, salt)
return
}
以下も参考にすると良い
Go Code Review Commentsの翻訳
# おわりに
多分もっとあるけどパッと思いついたのはこれぐらいでした。