14

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

import lumber

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

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

4

2 回答 2

23

详细说明 jnml 的答案:

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

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

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

对所有导入的包以及由这些包导入的包都重复此过程,一直沿依赖链向下。

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

要更深入地了解其工作原理,请参阅构建文档

于 2013-06-05T10:04:51.223 回答
15

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

$ go get github.com/jcelliott/lumber

这会将存储库克隆到$GOPATH/src/github.com/jcelliott/lumber. 然后你可以通过在你的代码中导入包来使用它

import "github.com/jcelliott/lumber"

关于范围规则:声明和范围

于 2013-06-05T07:04:52.653 回答