はじめに
Go の internal パッケージの仕様について実際にコードを動かして確認します。
Go 1.4 “Internal” Packages
Internal packages | Go 1.4 Release Notes
要約
internal の一個上の階層のパスを見て、そのパスの下に配置されているパッケージからならアクセス可能です。たぶん。
架空の例
- github.com/xxxx/foo/internal/bar というパッケージがある
- internal の一個上は github.com/xxxx/foo
- github.com/xxxx/foo の下に属する全てのパッケージは github.com/xxxx/foo/internal/bar にアクセス可能
- github.com/xxxx/foo/buz/qux も github.com/xxxx/foo/internal/bar にアクセス可能
実際の例
- golang/go/src/cmd/internal/diff というパッケージがある
- internal の一個上は golang/go/src/cmd
- golang/go/src/cmd の下に属する全てのパッケージは golang/go/src/cmd/internal/diff にアクセス可能
- golang/go/src/cmd/gofmt も golang/go/src/cmd/internal/diff にアクセス可能
実際にやってみた
前提
foo/**/main.go
package main
import (
"foo/**/internal/**/hello"
)
func main() {
hello.Hello()
}
foo/**/internal/**/hello/hello.go
package hello
import "fmt"
// Hello ...
func Hello() {
fmt.Println("Hello, World!")
}
パターン1(呼べるやつ)
foo
├── internal
│ └── hello
│ └── hello.go
├── go.mod
└── main.go
foo/internal
は foo
から呼べる。
パターン2(呼べないやつ)
foo
├── bar
│ └── internal
│ └── hello
│ └── hello.go
├── go.mod
└── main.go
foo/bar/internal
は foo
から呼べない。
パターン3(呼べるやつ)
foo
├── bar
│ ├── internal
│ │ └── hello
│ │ └── hello.go
│ └── main.go
└── go.mod
foo/bar/internal
は foo/bar
から呼べる。
パターン4(呼べるやつ)
foo
├── cmd
│ └── bar
│ └── main.go
├── internal
│ └── hello
│ └── hello.go
└── go.mod
foo/internal
は foo/cmd/bar
から呼べる。
結論
internal の 一個上を基準に考えればよさそうです。