让我们确认一下Go 1.4版本的“内部”包的行为
首先
我们将运行代码来验证 Go 的内部包的规范。
Go 1.4 版本的“Internal”包
内部包 | Go 1.4 发布说明
简洁地说
看一下上级路径,如果从这个路径下的包中访问,那可能是可以的。也许。
虚构的例子
-
- 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 にアクセス可能
我亲自实践了一下
前提 (Qian ti)
package main
import (
"foo/**/internal/**/hello"
)
func main() {
hello.Hello()
}
package hello
import "fmt"
// Hello ...
func Hello() {
fmt.Println("Hello, World!")
}
模式1(可以称呼的人)
foo
├── internal
│ └── hello
│ └── hello.go
├── go.mod
└── main.go
foo/internal可以从foo中调用。
第二个模式(不能被称呼的人)
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 中调用。
第四种模式(可以被调用的那一个)
foo
├── cmd
│ └── bar
│ └── main.go
├── internal
│ └── hello
│ └── hello.go
└── go.mod
foo/internal 可以从 foo/cmd/bar 被调用。
总结
从内部的一个更高级别的角度来考虑可能更好。