notebook

知ったこと、気になったこと、気づいたことを書き残す。

golangの循環importにハマった

tl;dr

やる気失せた。

循環import

golangには循環importというエラーがあります。

error| go list:Error:import cycle not allowed

簡単に言ってしまえば、パッケージ同士が互いをimportし合っていたらコンパイルエラーとなります。
パッケージAがパッケージBをimportしていて、パッケージBでもパッケージAをimportしていたら循環importの出来上がりです。

パッケージA → パッケージB → パッケージA → パッケージB → ...

設計をしっかり考えていないと割とハマります。
私はライブ感でコーディングしてたらハマってしまいました。プログラムの構成から考え直さなきゃいけないので中々修正する気が出ません。(:3」∠)

対策

対策と言っても、コンパイルレベルのエラーである以上、循環importにならない設計を心がけるとしか言えなそうですが、一応、

  • インターフェースを利用する

    golangではinterfaceを実装する場合にはimplements宣言とかいらず、interfaceが定義されているパッケージをimportする必要もありません。
    interfaceに沿った関数を提供すれば実装したことになりinterface型で扱えるようになります。(ダックタイピングってやつなんでしょうか?)
    これを利用すれば、使われる側から使う側をimportせずに参照できるようになります。
    詳しく説明するのは面ど...大変なので調べてみてください。DIとかそういう話にもなってきたりならなかったり。

  • 全部同じパッケージにする

    バカアホ

まとめ

何も考えず思いつきで実装していたツケが回ってきました。これからはコンパイラに怒られないように気をつけようと思います。
golangのinterface周りは活用できればいい感じのコードを書けそうですね。テストも書きやすくなりそう。
この記事書きながらコードいじってたら直せそうな気がしてきたのでもう少し頑張ります。
くりーんあーきてくちゃ?なにそれ