パッケージ外部からの呼び出しを禁止する 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.go
は chunked transfer encoding の仕組みを実装したもののようだが, net/http
およびその配下のパッケージ以外では使えない。
また net/internal
フォルダ以下には socket テスト用の net/internal/socktest
パッケージがあるが,これも外部から再利用できない。
これは再利用の難しいパッケージを配置する場合にはよい仕掛けである。
ビジネスロジックには再利用が難しいものが多いので,そういったものを internal
フォルダ以下に置けば,うっかり他所で使われるといったこともなく安全である。
なお, Internal Packages の制約から外すには internal
フォルダの外側にパッケージを再配置すればよい。