パッケージ外部からの呼び出しを禁止する Internal Packages

(初出: そろそろ真面目に Golang 開発環境について考える — Internal Packages と Vendoring - Qiita

GOPATH 汚染問題」で言及しそこねたので,今回は軽く。

Internal Packages の仕組みは 1.4 から存在したが標準パッケージのみの適用だった。 1.5 からは GOPATH 配下のパッケージまで拡張される。

要するに internal フォルダ以下のパッケージは外部から参照できない。 例として net パッケージを挙げてみる。 net パッケージのソースコードの構成は以下のようになっている。

C:\Go\src\net> tree .
C:\GO\SRC\NET
├─http
│  ├─cgi
│  │  └─testdata
│  ├─cookiejar
│  ├─fcgi
│  ├─httptest
│  ├─httputil
│  ├─internal
│  ├─pprof
│  └─testdata
├─internal
│  └─socktest
├─mail
├─rpc
│  └─jsonrpc
├─smtp
├─testdata
├─textproto
└─url

net/http/internal パッケージには chunked.go ファイルが含まれる。 chunked.gochunked transfer encoding の仕組みを実装したもののようだが, net/http およびその配下のパッケージ以外では使えない。 また net/internal フォルダ以下には socket テスト用の net/internal/socktest パッケージがあるが,これも外部から再利用できない。

これは再利用の難しいパッケージを配置する場合にはよい仕掛けである。 ビジネスロジックには再利用が難しいものが多いので,そういったものを internal フォルダ以下に置けば,うっかり他所で使われるといったこともなく安全である。 なお, Internal Packages の制約から外すには internal フォルダの外側にパッケージを再配置すればよい。

ブックマーク

Go 言語に関するブックマーク集はこちら