Go Package
package 基本使用
(1)目中的每个文件夹都是一个package。package下可以嵌套package。但每个.go文件的package以其所在的当前文件夹为准。
(2)在GoLand中新建文件夹时,在该层目录下新建的.go文件,其package默认为当前文件夹名大小写一致。当.go文件创建后,再去修改文件夹名时,需要注意其下的.go文件中的package是否自动修改。
(3)同一层目录下的.go文件,package必须一致,否则编译出错
package 可见性
在go语言中,变量或函数名的首字母大写时,其就是可导出的,小写时则是不可导出的。
函数和变量的可访问性是以包做隔离的
包 | 函数或变量 | 可访问性 |
---|---|---|
同一个包 | 可/不可导出的 | 都能访问 |
其他的包 | 可导出的 | 可访问 |
其他的包 | 不可导出的 | 不能访问 |
同一个包内,均可访问导出/不可导出的变量或函数。无论变量是全局变量还是struct的成员变量,无论函数是全局函数还是隶属于某个struct的成员函数。
package main
main是个特殊的package。go的可执行方法,只有main包下的main方法。
同一级文件夹下的package是main,当该文件夹下的某个.go文件调用同级目录下的变量或方法时,静态编译不报错,但是执行run动态编译时,就会报undefined错误。
dir A
a1.go
a2.go
---- a1.go
package main
func main(){
//静态编译(即写代码时)不报错
//运行该main()方法时,报错
B() //调用a2.go文件的B()方法
}
----- a2.go
package main
func B(){
fmt.Plintln("I am B()")
}
go 初始化顺序
运行main方法时:
- 先初始化import的所有包
- 先初始化const常量,然后是全局变量var,再是init()函数
- 当import下的包都初始化结束后,最后执行main的const, var,init(), main()