package
包(package)fmtosio
包的定义
src 目录是以代码包的形式组织并保存 Go 源码文件的。每个代码包都和 src 目录下的文件夹一一对应。每个子目录都是一个代码包。
!! 代码包包名和文件目录名,不要求一致。比如文件目录叫 server,但是代码包包名可以声明为 “main”,但是同一个目录下的源码文件第一行声明的所属包,必须一致!
.go
注意事项:
packagepackage-mainmainimport
可见性
如果想在一个包中引用另外一个包里的标识符(如变量、常量、类型、函数等)时,该标识符必须是对外可见的(public)。在Go语言中只需要将标识符的首字母大写就可以让标识符对外可见了:
结构体中的字段名和接口中的方法名如果首字母都是大写,外部包可以访问这些字段和方法:
main包
Go 语言的入口 main() 函数所在的包(package)叫 main,main 包想要引用别的代码,需要import导入!
包的导入(import)
import
A:通常导入
B:点操作 有时候会看到如下的方式导入包
fmt.Println("hello world")Println("hello world")
注意事项:
$GOPATH/src//
自定义包名
自定义包名顾名思义可以把包命名成另一个用起来容易记忆的名字。导入时,可以为包定义别名,语法演示:
匿名导入包
_
这个操作经常是让很多人费解的一个操作符:
init()
!! 导入的包的路径名,可以是相对路径也可以是绝对路径,推荐使用绝对路径(起始于工程根目录)。
匿名导入的包与其他方式导入的包一样都会被编译到可执行文件中。
init()函数
init()函数介绍
init()init()init()
包初始化执行的顺序如下图所示:
init()函数执行顺序
main
init()
!! 禁止循环引用包:A -> B -> C -> A
init函数与main函数的异同
相同点:
- 两个函数在定义时不能有任何的参数和返回值。 都只能由 go 程序自动调用,不可以被引用。
不同点:
- init 可以应用于任意包中,且可以重复定义多个。 main 函数只能用于 main 包中,且只能定义一个。
- 两个函数的执行顺序:
在 main 包中的 go 文件默认总是会被执行。对同一个 go 文件的 init( ) 调用顺序是从上到下的。
对同一个 package 中的不同文件,将文件名按字符串进行“从小到大”排序,之后顺序调用各文件中的init()函数。
对于不同的 package,如果不相互依赖的话,按照 main 包中 import 的顺序调用其包中的 init() 函数。
如果 package 存在依赖,调用顺序为最后被依赖的最先被初始化,例如:导入顺序 main –> A –> B –> C,则初始化顺序为 C –> B –> A –> main,一次执行对应的 init 方法。main 包总是被最后一个初始化,因为它总是依赖别的包