包的特征
-
一个目录下的同级文件归属一个包。
-
包名可以与其目录不同名。
-
包名为
main
的包为应用程序的入口包,编译源码没有main
包时,将无法编译输出可执行的文件。 -
修改了一个源文件,我们必须重新编译该源文件对应的包和所有依赖该包的其他包。
Go编译速度快速的原因
-
第一点,所有导入的包必须在每个文件的开头显式声明,这样的话编译器就没有必要读取和分析整个源文件来判断包的依赖关系。
-
第二点,禁止包的环状依赖,因为没有循环依赖,包的依赖关系形成一个有向无环图,每个包可以被独立编译,而且很可能是被并发编译。
-
第三点,编译后包的目标文件不仅仅记录包本身的导出信息,目标文件同时还记录了包的依赖关系。因此,在编译一个包的时候,编译器只需要读取每个直接导入包的目标文件,而不需要遍历所有依赖的的文件。
导出包中的标识符
Go
语言导出包中的标识符的方法应该是最为简单的了。只需要将所需导出的变量的首字母变成大写既可以在外包对该变量进行访问
设置不可导出和可导出的标识符:
package model
/* 定义一个不可以被外包访问的常量 */
const canNotFind = "Lucifer"
/* 定义一个可以被外包访问的常量 */
const CanFind = "JunkingBoy"
在main
包下对可导出的标识符进行导出使用:
package main
import (
"GoPracticePakage/Practice_Pakage/model"
"fmt"
)
func main() {
c := model.CanFind
fmt.Println(c)
}
导出结构体和接口成员也是一样的,通过修改结构体或者接口成员的名称将首字母改成大写既可以实现:
/* 设置包外不可以访问的结构体 */
type canNotFindStruct struct {
}
/* 设置包外可以访问的结构体 */
type CanFindStruct struct {
}
/* 设置包外不可访问的接口 */
type canFindInter interface {
}
/* 设置包外可访问的接口 */
type CanFindInter interface {
}