Golang中包(Package)是函数和数据(如常量)的集合,它将相关特性的函数和数据放在统一的文件或文件夹中进行管理。
介绍
- 包是 Golang 中代码发布的独立单位,可以提供给其他项目使用
- Golang 源代码文件使用
package
在文件头声明包,有以下几个作用
- 限定包内成员对外的访问属性(同一个包内是共享的)
- 告诉编译器包的文件范围
- 在包外,可以使用
import
关键字导入对应的包名
- 包名命名规则
- 小写字母组成,通常与所在的文件夹名称保持一致
- 同一个目录下的
包名
必须一致
- Golang 规定,
package main
是主函数(可运行的程序)所在的包,其他的均为库文件的形式存在
常见的包和函数
main 包
:用来告诉编译器将包编译为二进制的可执行文件
main() 函数
:二进制程序的入口,无返回值、无参数
init() 函数
是 Golang 内置函数,用来初始化包使用。无返回值、无参数。一般每个包只定义一个。
init() 函数
在 导入(import)包
时自动被调用(在常量、全局变量声明后面)
- 执行顺序:顺序 import 的
init() 函数
> main 包的 init() 函数
> main() 函数
先调用
- 作用:用于初始化操作,如数据库连接池建立等
包导入方式
- 绝对路径导入:
import <路径>
- 相对路径导入:
import ./<相对路径>
不推荐使用
- 别名导入:
import <alaise-name> "<路径>"
解决多个包名冲突问题
- 下划线导入:
import _ <路径>
使用空白符导入的包可以不使用,但一般在对应的文件中定义初始化函数 func init() {}
- 点导入:
import . <路径>
将路径下所有变量都导入,可能存在冲突,不推荐使用
说明:
<路径>
一般是 <$GOPATH/src 下的子目录>
- 若使用 go modules,需要使用
modules-name/pkg-name
格式导入包
引用其他包示例
package main
import (
"fmt"
"github.com/xiexianbin/gseo/utils"
)
func main() {
fmt.Println(utils.EId())
}
其中 github.com/xiexianbin/gseo/utils
是已经发布到 github 的包
包成员可见性
Golang 使用名称首字母大小写判断对应(函数、常量、变量、结构体等)的访问权限
- 首字母大写:包外可见(类似于
java
的 public
)
- 首字母小写:包外不可见(类似于
java
的 private
)
Go vendor 机制
将 golang 项目依赖包安装到项目根目录的 vendor
目录下(类型与 src 的目录结构),在编译项目时,使用该 vendor 目录中的依赖源码包,该方式解决如下问题:
- 依赖的兼容性,不同项目对包依赖不同
- 本地存储依赖代码,防止因原始仓库变动导致该项目编译失败问题
此时,包的搜索顺序:
项目根目录 vendor 目录 -> $GOPATH/src 相关目录 -> $GOPATH 目录 -> $GOROOT 目录(系统包)