# Go パフォーマンスチェッカー
## 文字列
- [ ] 文字列結合で `+`演算子を使わない(`bytes.Buffer`か`strings.Join()`を使う)
- [ ] 正規表現をなるべく使わず、`strings`パッケージを使う
## IO
- [ ] `fmt.Print`系を使わず、バッファリングする
```go
// 良い例
b := bufio.NewWriter(os.Stdout)
defer b.Flush()
for i:=0;i<10;i++{
fmt.Fprintln(b,strings.Repeat("a",100))
}
```
## 並行処理
- [ ] 重い処理を直列で処理している部分はないか
- [ ] チャネルを必ず`close`する
- [ ] Mutexのロック処理は必要なところだけ
- [ ] `context.WithCancel`や`context.WithTimeout`を使うときは必ず`defer cancel()`を書く
## http関連
- [ ] タイムアウトを設定していい場合は設定する
- [ ] HTTPリクエストを送る時`defer resp.Body.Close()`
- [ ] 静的ファイルをアプリケーションから配信せず、Nginxなどに移譲
## DB
- [ ] N+1はダメよダメダメ
- [ ] 何度も`sql.Open`を呼び出さない
- Goの`sql.DB`構造体は0以上のコネクションプールを持っていて、複数のGoroutineからのアクセスにも対応している
- そのため、何回も`sql.Open`を使うとコネクションリークを起こしてしまう
- [ ] `sql.SetMaxIdleConns`と`SetMaxOpenConns()`でコネクション数を変更する
- [ ] このときMySQL側のmax connectionも確認する
- ref : [https://qiita.com/methane/items/ccd3fd856b02b06c9452](https://qiita.com/methane/items/ccd3fd856b02b06c9452)
## reflect
- [ ] そもそも使わない