更多参见: 从0开始学GO之目录
包
Go语言的源码复用是建立在包(package)基础之上的。
包介绍
包(package)
是多个Go源码的集合,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如fmt
、os
、io
等。
定义包
一个包可以简单理解为一个存放.go
文件的文件夹。 该文件夹下面的所有go文件都要在代码的第一行添加如下代码,声明该文件归属的包。
package 包名
注意事项:
- 一个文件夹下面只能有一个包,同样一个包的文件不能在多个文件夹下。
- 包名可以不和文件夹的名字一样,包名不能包含
-
符号。 - 包名为main的包为应用程序的入口包,编译时不包含main包的源代码时不会得到可执行文件。
创建的的自定义包最好放在GOPATH
的src目录下(或者GOPATH
src的某个子目录)。
包中成员以名称⾸字母⼤⼩写决定访问权限:
- public: ⾸字母⼤写,可被包外访问
- private: ⾸字母⼩写,仅包内成员可以访问
注意:同一个目录下不能定义不同的package。
包的导入
要在代码中引用其他包的内容,需要使用import
关键字导入使用的包。具体语法如下:
import "包的路径"
注意事项:
- import导入语句通常放在文件开头包声明语句的下面。
- 导入的包名需要使用双引号包裹起来。
- 包名是从
$GOPATH/src/
后开始计算的,使用/
进行路径分隔。
import "包1"
import "包2"
// 或者
import (
"包1"
"包2"
)
自定义包名
在导入包名的时候,我们还可以为导入的包设置别名。具体语法格式如下:
import 别名 "包的路径"
匿名导入包
如果只希望导入包,而不使用包内部的数据时,可以使用匿名导入包。具体的格式如下:
import _ "包的路径"
匿名导入的包与其他方式导入的包一样都会被编译到可执行文件中。
init()初始化函数
在Go语言程序执行时导入包语句会自动触发包内部init()函数的调用。需要注意的是: init()函数没有参数也没有返回值。
package main
import "fmt"
var x = 1024
func init() {
fmt.Println(x)
}
func main() {
fmt.Println("Hello World!")
}
全局声明 -----> init() ----->main()
Go语言包会从main
包开始检查其导入的所有包,每个包中又可能导入了其他的包。Go编译器由此构建出一个树状的包引用关系,再根据引用顺序决定编译顺序,依次编译这些包的代码。
在运行时,被最后导入的包会最先初始化并调用其init()
函数, 如下图示:
图片来自 https://www.cnblogs.com/aaronthon/p/10776341.html
代码示例见下 工程管理
init()函数与main()函数对比
- 都是go语言中的保留函数。init()用于初始化信息,main()用于座位程序入口。
- 两个函数定义的时候,不能有参数和返回值,只能由go程序自动调用,不能被引用。
- init()函数可以定义在任意包中,可以有多个。main()函数只能在main包下,并且只能有一个。
- 存在依赖的包之间不能循环导入。
- 一个包可以被其他多个包import,但是只能被初始化一次。
工程管理
Go命令行工具完全用目录结构和包名来推导工程结构和构建顺序。如下图
图片来自 : 01 | 工作区和GOPATH https://time.geekbang.org/column/article/12959
这里如下图 修改 环境变量GOPATH
包含 工作区HelloWorld,如果还有其他工作区继续添加 环境变量GOPATH
包含路径
GOPATH:若干工作区目录的路径。是我们自己定义的工作空间。
src目录下各种目录为各种包如下图
GitHub:
输出:
命令工具使用
也可以手动使用GO命令工具
确认路径,可以使用 命令 go env
当然也可以查看环境变量
GOBIN
为 go install
安装目录
在工作区执行命令 go build
在工作区执行命令 go install
后 GOBIN
中出现 可执行文件
GoLand 输出目录设置
个人能力有限,如有错误或者其他建议,敬请告知欢迎探讨,谢谢!