章节
- import 导包基础语法简介
- import 导包原理
- import 导包实践
1.import 基础语法简介
1.1 import语句可以导入源代码文件所依赖的package 包
1.1.1 import fmt 包
package main
import "fmt"
func main() {
fmt.Println("测试")
}
1.2 不得导入源代码文件中没有用到的package,否则Go语言编译器会报编译错误
1.2.1 引入源代码程序中用不到的time包 (2018版的 goland 可以自动去除没有使用的package)
1.3 import 语法格式分为两种
1.3.1 语法格式1
import "package1"
import "package2"
import "package3"
1.3.2 语法格式2
import (
"package1"
"package2"
"package3"
)
2 import原理
- 如果一个package main 中导入其他的包,包将被顺序导入;
- 如果导入的包中依赖其他包(包B),会首先导入B包,然后初始化B包中常量和变量,最后如果B包中有init()方法,会自动执行init();
- 所有包导入完成后才会对main中的常量和变量进行初始化,谈后执行main中的init函数(如果存在),最后执行main函数;
- 如果一个包被导入多次则该包只会被导入一次;
即 先初始化依赖包,包中内容的初始化为 常量&变量->init()函数->main(主程文件)中的main()函数
import导入依赖包原理图如下所示:
3.import 导包实践
3.1 创建learn01 、show02两个包
代码如下所示:
learn/lean01.go
package learn01
import "fmt"
//初始化函数
func init() {
fmt.Println("learn_1 init")
}
//a函数 什么都不做
func Learn1() {
}
show02/show.go
package show02
import "fmt"
//初始化函数
func init() {
fmt.Println("show_2 init")
}
//函数名大写
func Show2() {
}
main.go
package main
//问题1:没有自动 import 相关的包
import (
"fmt"
"learn01"
"show02"
)
/**
注意:无论fmt println 函数放在learn01.Learn1() show02.Show2()之前还是之后都是最后打印的,
这其实是import原理导致的
*/
func main() {
fmt.Println("main println")
learn01.Learn1()//注意此为空方法体
show02.Show2()
}
问题列表:
- 最新版goland 2018.02版本对于源代码的放置路径有严格要求,必须放置在项目的 src 目录下?
- import 自动导包功能缺失?
以上两个问题在网上暂时没有找到解决方案,估计是个人 ide 设置出现问题-待解决。
运行结果如下所示:
注意:不同包的init()函数执行先后顺序跟导包顺序相关。