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