Go中的内部包

时间:2017-01-10 15:05:50

标签: go import package

如何在Go中导入内部包?

import (

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

像这样没有出错:

  

导入runtime / internal / atomic:不允许使用内部包

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

2 个答案:

答案 0 :(得分:16)

Background

  

Go鼓励将程序结构化为使用导出API进行交互的包的集合。但是,可以导入所有包。这在实现库或命令时会产生张力:它可能会变得足够大以构建为多个包,但是拆分它会将这些附加包中使用的API导出到世界。能够制造能见度有限的包装将消除这种紧张局势。

建议采用Go 1.4

的规则

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

简短回答

你不能(至少很容易),你不应该。

答案 1 :(得分:3)

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

// 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

Docs about import comments

您可以在内部包中找到包含grep -r "// import" ./vendor-local/nettest

的所有导入评论

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

您可以,但dep ensure等不支持本地软件包的工具会清除您的副本。