LoginSignup
7
7

More than 3 years have passed since last update.

【Go】書く時に気にすべきこと(よりリーダブルなコードにするために)

Last updated at Posted at 2019-07-21

背景

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. メソッドの引数をポインタにするときは明確に理由を持つ

  1. メソッドが引数の値を変更するとき。
  2. 画像などサイズの大きい引数のとき

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の翻訳

 おわりに

多分もっとあるけどパッと思いついたのはこれぐらいでした。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7