1.包的由来
为了代码更好的维护和复用,Go语言按程序的功能性将源代码分割成一个个逻辑单元,组织成若干组文件,每组文件被称为一个包。这样开发人员可以以包为单位对代码进行维护,也可以以包为复用单元,引入到其他项目。
2.包名
为了方便包的定位,建议包名和目录名一致,即以.go为后缀名的源文件,其第一行代码所声明的包名和 此文件所属的目录名一致。
3.包的分类
3.1main包
Go语言编译的可执行程序,其包名必须是main,而且这个main包里一定要有且仅有一个main()函数。如此,Go语言的编译程序会试图把main包编译为二进制的可执行文件,而main()函数就是这个程序的入口。
3.2标准包
Go程序再安装的时候就已经安装了Go语言的标准库,内置与Go语言的安装包下面的src包,它基本实现了Go语言的常用功能。它的导入格式如下:
import (
"fmt" //fmt包用于格式化输出
"sort" //sort包提供了排序切片和用户自定义数据集的函数
)
3.3程序的内部包
程序内部包,包括下载到本地的源码包和自定义代码包。Go语言规定下载到本地的源码包和自定义的代码包都放在GOPATH的src目录下(或者GOPATH的src的某个子目录下)。
3.3.1同一路径下的不同文件
再Go语言程序里,同一路径下多个文件被Go语言编译器看做是一个文件。程序里声明的包名必须相同(建议包名和目录名一致),可以直接相互引用数据(全局变量,函数,结构体,结构体成员),不能导入路径。因此,在这多个文件中不能出现同名的全局变量名,函数名,结构体类型名,结构体成员变量名,首字母大小写均不可以。
3.3.2 不同路径下的不同文件
不同路径下的文件,程序声明的包名可以相同,也可以不同,但再执行程序中导入另一个文件中的数据,必须导入另一个文件所在的路劲。
GOPATH环境变量为~/Go/src
假如所需要导入的函数所在的文件sort,go的路径为:~/Go/src/Demo/sort/sort.go
则再执行程序中写入下面的代码:
import "Demo/sort"
4.导入包中的代码调用
4.1可见性规则
如果包内(main包除外)的全局变量名,函数名,结构体类型名,结构体成员变量名的首字母大写,则可以被外部包访问;如果小写,只能被同一个包里的文件访问。
4.2包中的代码调用
调用对象 | 调用格式 |
导入包全局变量 | 包名.全局变量名 |
导入包函数 | 包名.函数名 |
导入包结构体 | 包名.结构体类型 |
导入包结构体对象 | 结构体变量名.成员对象名 |
package dcdfvfer
import "fmt"
var A int = 10 //全局变量,首字母大写
var a int = 5 //全局变量,首字母小写
/*结构体变量,首字母大写*/
type Student struct {
/*结构体成员变量,首字母小写*/
male byte
/*结构体成员变量,首字母大写*/
Num int
}
/*结构体变量,首字母小写*/
type teacher struct {
Male byte
Num int
}
func Ha() {
fmt.Println("hello")
}
func ha() {
fmt.Println("哈喽")
}
package main
import (
"Demo/dcdfvfer"
"fmt"
)
func main() {
fmt.Println("A=", dcdfvfer.A) //包名.全部变量
//fmt.Println(a) //不能被调用
var s dcdfvfer.Student //包名.结构体类型
//s.male ='m' //不能被调用
s.Num = 1
fmt.Println("s=", s)
//var t dcdfvfer.teacher //不能被调用
dcdfvfer.Ha() //包名.函数名
//dcdfvfer.ha() //不能被调用
}