Go中每一个文件属于一个包
标准目录结构
go-root-name
src
project-name
dir1
dir2
dir3
package "demo" //打包
import "demo" //导包
import(
"demo1"
"demo2"
demo3 "demo3"
)
import packageAlias "package" //导包并设置包的别名,但原来的名字就不能再使用
- package、namespace
- 尽量保持目录名与包名一致,当然可以不一样
- 访问权限控制,首字母大写表示公有,可以被其他包访问,首字母小写表示私有,只能被本包使用
- import导包包名需要使用双引号包裹,因为本质上是路径,默认根为GOROOT/src/,使用/进行分隔,其中GOROOT为环境变量(对,就是高级系统设置、环境变量,只是IDE会自动本地维护)
- main函数只能在main包下,否则会报错,cannot run non-main package
- 一个目录下的同级别go源文件只能属于同一个包
- 导包时可以设置包的别名,但是设置别名后原名不能再使用
init函数
package main
import (
"fmt"
"gocode/testproject01/unit5/demo10/testutils"
)
var Num int = test()
func test() int {
fmt.Println("test函数被执行")
return 10
}
func init() {
fmt.Println("main.go中的init函数被执行!")
}
func main() {
fmt.Println("main函数被执行!")
fmt.Printf("Age= %d, Sex= %s, Name= %s\n", testutils.Age, testutils.Sex, testutils.Name)
}
这段代码的执行流程如下:
- testutils中的全局变量初始化,init函数调用
- 程序开始执行,首先会初始化全局变量
Num,这会调用test()函数。 - 在
test()函数中,打印出”test函数被执行”,然后返回10,这个值被赋给Num。 - 接着,
main.go中的init函数被执行,打印出”main.go中的init函数被执行!”。 - 然后,程序执行
main函数,打印出”main函数被执行!”。 - 最后,使用
fmt.Printf打印出testutils包中的Age、Sex和Name变量的值。
go中已package组织源码,每个包即一个文件夹,包中可以包含若干go文件,包中的每个go文件必须声明package name且保证包名一致
main包比较特殊,其定义一个独立可执行程序,main包中的main函数为整个程序的执行入口,其他包中的main仅仅是一个普通函数
包级别变量的初始化先于包内init函数的执行。
一个包下可以有多个init函数,每个文件也可以有多个init 函数。
多个 init 函数按照它们的文件名顺序逐个初始化。
应用初始化时初始化工作的顺序是,从被导入的最深层包开始进行初始化,层层递出最后到main包。
不管包被导入多少次,包内的init函数只会执行一次。
应用在所有初始化工作完成后才会执行main函数。