😺

GoのInternalパッケージの使いどころ

2024/08/02に公開

はじめに

GoのInternal packageの使いどころについて。
自分の中で腑に落ちるところがあったので書き残しておこうと思います。

Internal Packageについて

GoにはInternal packageという機能があります。
これはinternalディレクトリ以下の実装は他のレポジトリからimportしても参照することができなくする機能です。

projectA/internal/pkg1/some.goの中にExportedな関数func DoSomething()があったとして、
projectBでimport github.com/projectAしても、projectBの中からはDoSomething()できません。
対して同じレポジトリの別pkgであるprojectA/pkg2/other.goの中からは呼ぶことができます。

使いどころは?

機能の動作については理解できるのですが、具体的に何がうれしいの?というのが全くピンときませんでした。
Goでアプリケーションを開発をしていると、このInternal Packageの動作や制約にあたることはまずありませんでした。

同じレポジトリ内で完結した開発をすることが多いし、
アプリケーション用のコードを他のプロダクトから参照してもらうことも、
importしたライブラリの公開関数はIDEから参照可能なものしか目に入らないため。

利用ケース

ではどういう時に使うと良いか、効果を発揮するかというと、
ライブラリの実装をするときです。

Goはパッケージが異なるとExportedな関数しか参照できないため、
「pkgを分けたために他のpkgから参照してもらうためにExportedにする」ケースがありえますが、
importした利用者には使ってほしくない・参照すべきでない関数である場合もあります。
その場合にInternal Packageの機能を使っておけば、以下のような制限を設けられます。

  • 同じライブラリ内からはアクセス可
  • importした利用者からはアクセス不可

このように第三者利用を考えた場合には有用な機能だと感じます。

Discussion