跳到主要内容

包和模块

前言

在很多编程语言中,为了封装和隔离代码,同时也为了代码复用,都有包或者命名空间的语法要素,比如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"
)