持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
1.从 GitHub 安装包
如果想安装远端项目到本地机器,打开终端并执行:
go get -u github.com/ffhelicopter/tmm
这样现在这台机器上的其他 Go 应用程序也可以通过导入路径:”github.com/ffhelicopter/tmm” 代替 “./ffhelicopter/tmm” 来使用。 也可以将其缩写为:import ind “github.com/ffhelicopter/tmm”;开发中一般这样操作:
import "github.com/ffhelicopter/tmm"
Go 对包的版本管理做的不是很友好,不过现在有些第三方项目做的不错,有兴趣的同学可以了解下(glide、godep、govendor)。
2.导入外部安装包
如果你要在你的应用中使用一个或多个外部包,你可以使用 Go install在你的本地机器上安装它们。Go install 是 Go 中自动包安装工具:如需要将包安装到本地它会从远端仓库下载包:检出、编译和安装一气呵成。
在包安装前的先决条件是要自动处理包自身依赖关系的安装。被依赖的包也会安装到子目录下,但是没有文档和示例:可以到网上浏览。
Go install 使用了 GoPATH 变量
假RU想使用github.com/gocolly/col… 这种托管在 Google Code、GitHub 和 Launchpad 等代码网站上的包。
可以通过如下命令安装: Go install github.com/gocolly/colly 将一个名为 github.com/gocolly/colly 安装在$GoPATH/pkg/ 目录下。
Go install/build都是用来编译包和其依赖的包。
区别: Go build只对main包有效,在当前目录编译生成一个可执行的二进制文件(依赖包生成的静态库文件放在$GoPATH/pkg)。
Go install一般生成静态库文件放在$GoPATH/pkg目录下,文件扩展名a。
如果为main包,运行Go buil则会在$GoPATH/bin 生成一个可执行的二进制文件。
3.包的分级声明和初始化
你可以在使用 import 导入包之后定义或声明 0 个或多个常量(const)、变量(var)和类型(type),这些对象的作用域都是全局的(在本包范围内),所以可以被本包中所有的函数调用,然后声明一个或多个函数(func)。
如果存在 init 函数的话,则对该函数进行定义(这是一个特殊的函数,每个含有该函数的包都会首先执行这个函数)。
程序开始执行并完成初始化后,第一个调用(程序的入口点)的函数是 main.main()(如果有 init() 函数则会先执行该函数)。
如果 main 包的源代码没有包含 main 函数,则会引发构建错误 undefined: main.main。main 函数既没有参数,也没有返回类型,这一点上 init 函数和 main 函数一样。
main函数一旦返回就表示程序已成功执行并立即退出。
Go 程序的执行(程序启动)顺序如下: 程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。
Go语言中init函数用于包(package)的初始化,该函数是Go语言的一个重要特性,有下面的特征:
- init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等
- 每个包可以拥有多个init函数
- 包的每个源文件也可以拥有多个init函数
- 同一个包中多个init函数的执行顺序Go语言没有明确的定义(说明)
- 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
- init函数不能被其他函数调用,而是在main函数执行之前,自动被调用