包的概念
写第一个hello.go文件的时候,发现源码的第一行就有
package main
Go 语言的源码复用建立在包(package)基础之上。Go 语言的入口 main() 函数所在的包(package)叫 main,main 包想要引用别的代码,必须同样以包的方式进行引用。
Go 语言的包与文件夹一一对应,所有与包相关的操作,必须依赖于工作目录(GOPATH)
1、包的基本概念
一般包的名称就是其源文件所在目录的名称
虽然没有强制规定,但是建议这么做!这样结构更清晰
包的导入
import "包的路径"
- 单行导入
import "fmt"
import "rsc.io/quote"
- 多行导入
import (
"fmt"
"rsc.io/quote"
)
包的引用格式
- 标准引用
package main
import "fmt"
func main() {
fmt.Println("C语言中文网")
}
- 自定义别名引用
package main
import F "fmt"
func main() {
F.Println("C语言中文网")
}
- 匿名引用
import _ "fmt"
在引用某个包时,如果只是希望执行包初始化的 init 函数,而不使用包内部的数据时,可以使用匿名引用格式。
- 使用标准格式引用包,但是代码中却没有使用包,编译器会报错。
- 通过import _ “包的路径” 这种方式引用包,仅执行包的初始化函数,即使包没有 init 初始化函数,也不会引发编译器报错。
包加载过程

- go语言的编译器的包初始化程序会从main函数所在的包开始逐级向下搜索包的引用,直到某一个包没有进行引用为止,最终生成一个包引用的又向无环图
- 编译器会将有向无环图转换为树的形式,然后从树的叶子节点开始回溯对单个包进行初始化
- 对于单个包,首先对
常量进行初始化,然后是全局变量,再次之后才会执行init()函数
关于init()函数和包引用的注意事项
- 一个包可能包含多个
init()函数,在初始化的时候不能保证init函数的执行顺序,因此建议将逻辑写到一个init()函数中! - 包的引用不允许循环依赖,否则编译器无法生成包引用的有向无环图,会导致编译错误。
- 包的引用允许重复依赖,因为编译器会将又向无环图转换成树,这就能保证每个包的init()函数只被执行一次。

4817

被折叠的 条评论
为什么被折叠?



