概要
internal packageはgo1.4で追加されたものです。
Goでのアクセス制御は、大文字で始まるものがpublic、小文字で始まるものがprivateの2種類でしたが、
internal packageを使うことによって、package privateにすることができるようになりました。
背景
以下のような問題を解消するために、internal packageは追加されました。
- パッケージ外非公開とするために、標準ライブラリ内でコードが重複するケースがあった
net/http
を例に上げると、go1.3では、chunked.go
という全く同じファイルがnet/http
とnet/http/httputil
に2つ存在していました。
ソースコードにも、下記のようなコメントがあったりして残念な感じでした。
// This code is duplicated in net/http and net/http/httputil.
// Please make any changes in both files.
go1.4では、この重複はnet/http/internal/chunked.go
として1ファイルにまとめられています。
- goのmain repositoryのに必要な外部packageを、標準ライブラリに含めたくない
cmd/internal
にあるrsc.io/x86/x86asm
やrsc.io/arm/armasm
とか。
- compileをself hostingするとき、標準ライブラリには含めないlibrary packageを書く方法が必要になるはず
仕様
パッケージパスにinternal
が含まれる場合、import側はinternal
ディレクトリのあるパッケージと同一パッケージ内でなければいけません。
注意
ユーザのワーキングディレクトリ(GOPATH)では、まだ使えません。
様子を見て、go1.5以降からGOPATHにも適用されるようです。
以下は、net/http
パッケージの例です。
go1.4から新たにinternal packageが追加されています。
このinternal packageは、net/http
以下のpackageでのみimportできます。
net/url
やnet/rpc
などからはimportできません。
src/net/http
├── cgi
│ └── testdata
├── cookiejar
├── fcgi
├── httptest
├── httputil
├── internal
├── pprof
└── testdata
はやく、GOPATH以下でも使えるようになるといいですね。