Go実装におけるアンチパターン3選

0

2022年04月02日 9:49

Goを書き始めて1年ちょっとが経ちます。普段の何気ない開発の中でGo実装気づいたり、教えてもらったりなtipsをまとめてみました。皆さんの日々の開発がちょっと良くなればいいなと思います。

1. t.Paralelをサブテストにつけたのに、トップテスト関数にはつけない

サブテストにt.Parallel()をつけたなら、トップレベルの関数にもt.Parallel()をつけるようにしましょう。トップレベルにつけないと、結果的にトップレベルのテスト関数が終わった際にサブテストのテスト結果が逐次処理されるだけになり並列化の恩恵を受けることができません。詳しくはメルカリさんのブログの内容が参考になります。
img

2. Wrapをつけて、エラーの追跡をしていない

エラーハンドリングする際はWrapしてスタックトレースするようにした方がいいと思います。sentry等で本番運用していてエラーが起きた際にどこでどの経路を辿って発生したエラーなのかがわかるので、障害対応のスピードも早まります。Wraphttps://github.com/pkg/errors で利用することができます。スタックトレースはNewなどでも呼び出すことができます。ただ、独自エラーで返したり、追跡しやすいようにエラーメッセージを追加したりとある程度使う関数は限られていると思います。よく使われるのはWrapWithStackだと思います。

Wrap与えられたerrにメッセージを追加してスタックトレースするメッセージ付きでエラーをラップしたい時に使う
WithStack与えられたerrを元にスタックトレースする外部ライブラリのエラーや独自エラーなどをスタックトレースしたい場合に使う

3. Functional Optionパターンを使いすぎる

Go初学者の方でとくFunctional Optionパターンを使い、デフォルト引数を実現しよう!のように考えている人がいる気がします。確かにポインタを渡さないなど安全性の面などでも非常にすぐれて機能だと思います。一方でテストの際にmock利用できない問題も発生します。また個人的に記述量が増えるのが気になっていました。オプション1つ増やすだけで関数1つ増やす必要があります。ケースバイケースですが、気軽にFOPを実装する前に構造体や可変長引数を一度検討するのもいいのではないかと思います。

# Go
0

診断を受けるとあなたの現在の業務委託単価を算出します。今後副業やフリーランスで単価を交渉する際の参考になります。また次の単価レンジに到達するためのヒントも確認できます。

目次を見る