包和模块
前言
在很多编程语言中,为了封装和隔离代码,同时也为了代码复用,都有包或者命名空间的语法要素,比如c#中的namespace
以及java中的package
。Go语言中包的作用和其它语言 中的库和模块类似。
在go语言中,包的声明语法如下:
// 包名一般小写
package packagename
包名告诉编译器,当前文件属于哪个包。一般来说,Go语言包的源代码存放在一个根目录中,其中包含一个或者多个.go
文件。这些.go
文件按照目录进行分组并构建出上下级的层级结构。每组.go
文件被称为包。
所有.go
文件除了包的注释和空行外,第一行都应该对包进行声明。每个包都在一个单独的目录中,但不能将多个包放在同一个目录中,也不能将同一个包中的文件分散到不同的目录中。简单来说,同一个目录中的所有.go
文件必须属于同一个包名,否则会报错。
如果当前编写的Go程序要作为一个可执行的程序,那么必须包含一个main
包和一个main
函数。
示例代码: test.go
package pk2
import "fmt"
func Hello() {
fmt.Println("Hello World")
}
实例代码的文件名为test.go
,目录名为pk2
。
执行如下命令会生成库文件
go install ./test.go
如果成功执行,那么会在${GOPATH}/pkg/test2021
目录下生成一个pk2.a
文件。
包的导入
在go语言中,import实际上是包的路径,而不是包名。 一般来说,目录名和包名一样,但如果不同,那么import的时候,导入的是包路径,用的时候用package的名字。 包的导入语法如下:
import packagename
// 或
import (
"./test2021" // 当前目录下的test2021
)
示例:
package main
import (
"fmt"
"test2021/pk2"
)
func main() {
pk2.Hello()
fmt.Println("======")
}
go module的使用
go mod
是go version 1.12引入的一个包管理工具,在命令行执行go help mod
即可获知go mod
的用法。常用的选项如下:
download
:下载依赖edit
:编译go.mod
文件init
:初始化tidy
:拉取缺少的模块,移除不用的模块。go mod tidy
当程序中导入了系统没有的模块,编译器会提示使用go get
进行下载。如果是系统中的已有模块,那么执行go run
的时候,go.mod
会自动补充依赖关系。
使用go module,可以将go文件放到任何位置,而不只是go path。示例:
# 1. 新建一个空目录
mkdir gomodtest
# 2. 切换 目录
cd gomodtest
# 3. 初始化,生成go.mod文件
go mod init gomodtest
假设gomodtest目录下有个模块目录mod01,那么在main.go
中导入这个包的时候,路径需要从根路径开始。示例:
import (
"fmt"
"gomodtest/mod01"
)