
init()、main() 是 go 语言中的保留函数。我们可以在源码中,定义 init() 函数。此函数会在包被导入时执行,例如如果是在 main 中导入包,包中存在 init(),那么 init() 中的代码会在 main() 函数执行前执行,用于初始化包所需要的特定资料。
package main
import (
_ "l_package/pk1"
//"database/sql"
//_ "github.com/go-sql-driver/mysql"
//"fmt"
"l_package/pk2"
)
//import "l_package/utils" //绝对路径
//import "./utils" //相对路径
func main() {
/*
关于包的使用:
1.一个目录下的统计文件归属一个包。package的声明要一致
2.package声明的包和对应的目录名可以不一致。但习惯上还是写成一致的
3.包可以嵌套
4.同包下的函数不需要导入包,可以直接使用
5.main包,main()函数所在的包,其他的包不能使用
6.导入包的时候,路径要从src下开始写
*/
/*
init()函数和main()函数
1.这两个函数都是go语言中的保留函数。init()用于初始化信息,main()用于作为程序的入口
2.这两个函数定义的时候:不能有参数,返回值。只能由go程序自动调用,不能被引用。
3.init()函数可以定义在任意的包中,可以有多个。main()函数只能在main包下,并且只能有一个。
4.执行顺序
A:先执行init()函数,后执行main()函数
B:对于同一个go文件中,调用顺序是从上到下的,也就是说,先写的先被执行,后写的后被执行
C:对于同一个包下,将文件名按照字符串进行排序,之后顺序调用各个文件中init()函数
D:对于不同包下,
如果不存在依赖,按照main包中import的顺序来调用对应包中init()函数
如果存在依赖,最后被依赖的最先被初始化
导入顺序:main-->A-->B-->C
执行顺序:C-->B-->A-->main
5.存在依赖的包之间,不能循环导入
6.一个包可以被其他多个包import,但是只能被初始化一次。
7._操作,其实是引入该包,而不直接使用包里面的函数,仅仅是调用了该包里的init()
*/
}
localhost:~ ruby$ go get github.com/go-sql-driver/mysql
也就是说,对于go语言来讲,其实并不关心你的代码是内部还是外部的,总之都在GOPATH里,任何import包的路径都是从GOPATH开始的;唯一的区别,就是内部依赖的包是开发者自己写的,外部依赖的包是go get下来的。
Golang中的 Run go run xxx.go 也会生成编译的包文件xxx.a
我们可以通过go install 来编译包文件。
我们知道一个非main包在编译后会生成一个.a文件(在临时目录下生成,除非使用go install安装到$GOROOT或?$GOPATH下,否则你看不到.a),用于后续可执行程序链接使用。
比如Go标准库中的包对应的源码部分路径在:$GOROOT/src,而标准库中包编译后的.a文件路径在$GOROOT/pkg/darwin_amd64下。
原文:https://www.cnblogs.com/yzg-14/p/12250983.html