我尝试了解如何使用“内部”包组织代码。让我展示一下我的结构:
project/ internal/ foo/ foo.go # package foo bar/ bar.go # package bar main.go # here is the code from main.go package main import ( "project/internal/foo" "project/internal/bar" )
project/在GOPATH树之外。无论我尝试从main.go什么都不导入的任何路径都可行,唯一可行的情况是import "./internal/foo|bar"。我认为我做错了什么,或者总体上弄错了“内部”包装想法。任何人都可以让事情变得更清楚吗?
project/
main.go
import "./internal/foo|bar"
更新
上面的示例是正确的,我唯一需要的是将project/文件夹放在下$GOPATH/src。因此,project/internal/foo|bar如果我们仅从project/子树而不是从外部导入,则该导入路径是可行的。
$GOPATH/src
project/internal/foo|bar
包必须位于您的包$GOPATH中才能导入。您提供的示例可以执行,import "./internal/foo|bar"因为它可以进行本地导入。internal只是这样做使得不与您的internal目录共享通用根目录的代码无法导入包internal。
$GOPATH
internal
如果将所有这些内容放入gopath中,则尝试从另一个位置(例如OuterFolder/project2/main.go,其中OuterFolder包含两个位置)进行导入project,project2然后import "../../project/internal/foo"将失败。import "foo"由于不满足此条件,它也会以您尝试过的方式或其他任何方式失败;
OuterFolder/project2/main.go
OuterFolder
project
project2
import "../../project/internal/foo"
import "foo"
如果导入代码位于以“内部”目录的父级为根的树之外,则不允许导入包含“内部”元素的路径。
现在,如果你有路径$GOPATH/src/project,那么你可以做的import "foo",并import "bar"从内部$GOPATH/src/project/main.go和进口会成功。project但是,下面未包含的内容将无法导入foo或导入bar。
$GOPATH/src/project
import "bar"
$GOPATH/src/project/main.go
foo
bar