关于导入:Go中的内部软件包

Internal packages in Go

如何在Go中导入内部组件包?

1
2
3
4
5
import (

   "runtime/internal/atomic"
   "runtime/internal/sys"
)

就像这样,不会出现错误:

imports runtime/internal/atomic: use of internal package not allowed

并在主程序包中使用内部函数吗?


背景

Go encourages structuring a program as a collection of packages interacting using exported APIs. However, all packages can be imported. This creates a tension when implementing a library or command: it may grow large enough to structure as multiple packages, but splitting it would export the API used in those additional packages to the world. Being able to create packages with restricted visibility would eliminate this tension.

建议去1.4的规则

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

简短答案

您不能(至少很容易),而且不应该。


我将向您展示如何使用内部nettest软件包:

1
2
3
4
5
6
// I copied nettest to vendor with `dep ensure` I think. Then:
mkdir vendor-local
cp -r vendor/golang.org/x/net/internal/nettest ./vendor-local/nettest
vim ./vendor-local/nettest/stack.go and remove import comment // import"foo" [1]
// Use full import in your go file:
import"github.com/foo-user/bar-project/vendor-local/nettest"

[1]:https://github.com/golang/net/blob/a8b9294777976932365dabb6640cf1468d95c70f/internal/nettest/stack.go#L6

有关导入注释的文档

您可能会在内部包中使用grep -r"// import" ./vendor-local/nettest

找到所有导入注释

为什么我不能将nettest复制到./vendor并使用较短的导入

您可以,但是像dep ensure这样的不支持本地程序包的实用程序将清除您的副本。