小编典典

如何使用“内部”包?

go

我尝试了解如何使用“内部”包组织代码。让我展示一下我的结构:

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/文件夹放在下$GOPATH/src。因此,project/internal/foo|bar如果我们仅从project/子树而不是从外部导入,则该导入路径是可行的。


阅读 232

收藏
2020-07-02

共1个答案

小编典典

包必须位于您的包$GOPATH中才能导入。您提供的示例可以执行,import "./internal/foo|bar"因为它可以进行本地导入。internal只是这样做使得不与您的internal目录共享通用根目录的代码无法导入包internal

如果将所有这些内容放入gopath中,则尝试从另一个位置(例如OuterFolder/project2/main.go,其中OuterFolder包含两个位置)进行导入projectproject2然后import "../../project/internal/foo"将失败。import "foo"由于不满足此条件,它也会以您尝试过的方式或其他任何方式失败;

如果导入代码位于以“内部”目录的父级为根的树之外,则不允许导入包含“内部”元素的路径。

现在,如果你有路径$GOPATH/src/project,那么你可以做的import "foo",并import "bar"从内部$GOPATH/src/project/main.go和进口会成功。project但是,下面未包含的内容将无法导入foo或导入bar

2020-07-02