多个文件包如何在golang中运行?

时间:2013-06-05 06:35:23

标签: go package flow

This repo有3个go文件都以“package lumber”开头。 要使用这个包,我应该把它放在我的GOROOT中,只需

import lumber

在我的程序中。此包中的变量和类型如何跨多个文件相互连接? go编译器如何知道首先要读取哪个文件?

如果我想阅读包,我应该在哪里开始阅读以了解包装?这里的事情到底是什么?

2 个答案:

答案 0 :(得分:22)

详细说明jnml的答案:

在代码中使用import "foo/bar"时,您不是指源文件(位于$GOPATH/src/foo/bar/中)。

相反,您指的是$GOPATH/pkg/$GOOS_$GOARCH/foo/bar.a处的已编译包文件。当您构建自己的代码,并且编译器发现foo/bar包尚未编译(或已过期)时,它将自动为您执行此操作。

它通过整理* $GOPATH/src/foo/bar目录中的所有相关源文件并将它们构建到单个bar.a文件中来实现,该文件安装在pkg目录中。然后使用您自己的程序继续编译。

对于所有导入的包以及由它们导入的包重复此过程,一直到依赖链。

*)文件的整理方式取决于文件本身的命名方式以及文件内部存在的构建标记类型。

要更深入地了解其工作原理,请参阅build docs

答案 1 :(得分:15)

不,你不是“应该把它放在我的GOROOT中”。你应该执行

$ go get github.com/jcelliott/lumber

将存储库克隆到$GOPATH/src/github.com/jcelliott/lumber。然后,您可以通过在代码中将其导入为

来使用该包
import "github.com/jcelliott/lumber"

关于范围规则:Declarations and scope