跳到主要内容

模块和包

包(package) 是Go语言中最基本的代码组织单位。一个包通常包含一组相关的Go文件,并且这些文件共享相同的命名空间。

定义包

在一个Go文件中,通过在文件开头使用package关键字定义包名。一个目录下所有Go文件必须使用相同的包名。

mathutil.go
// 文件 mathutil.go
package mathutil

func Add(a, b int) int {
return a + b
}

导入包

通过 import 关键字在其他文件中使用包,Go语言中禁止循环导入包。

main.go
// 文件 main.go
package main

import (
"fmt"
"path/to/package/mathutil" // 引入包的路径名称,必须使用双引号
)

当引入多个包中存在相同包名或者想自行为某个包设置别名时

package main

import (
f "fmt" // 在包名前面定义别名
)

func main() {
f.Println("hello world") // 通过别名调用包中函数
}

如果引入一个包的时候为其设置特殊_作为包名,这个包的引入方式为匿名引入。一个包被匿名引入的目的主要是加载这个包,从而使得这个包中的资源得到初始化。

import _ "fmt"
信息

Go语言中不允许引入包却不在代码中使用的这个包的内容,如果引入而未使用的包则会触发编译错误。

包的命名和目录结构

  • 命名: 包的名字应简短并具有描述性,通常与目录名相同
  • 目录结构: Go语言通过目录结构来管理包,一个目录下的所有 .go 文件会组成一个包
/project
/main.go // 主程序文件,使用 "package main"
/mathutil
/mathutil.go // 定义 mathutil 包的文件

包的导入与非导出

  • 导出: 在Go中,包内的标识符(如变量,函数,类型)如果以大写字母开头,则是导出的,可以被包外使用。小写字母开头的标识符则是非导出的,只能在包内访问
package example

var PublicVar = 1 // 导出的变量
var privateVar = 2 // 非导出的变量

func PublicFunc() {} // 导出的函数
func privateFunc() {} // 非导出的函数

模块

模块(Module)是Go1.11引入的一种用于管理依赖的系统,它有多个包组成,并包含在一个单一的根目录下。模块帮助开发者管理项目中的依赖和版本控制。

  • 创建模块: 使用 go mod int 命令初始化模块
go mod init example.com/project

这会在根目录下生成一个 go.mod 文件,其中包含模块的路径和版本信息。

  • go.mod 文件: go.mod 文件是模块的配置文件,用于管理模块依赖和版本信息
module example.com/project

go 1.20

require ( // 声明依赖的关键字
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // 依赖的引入路径和版本号
)

require (
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect // indirect 作为其他包的依赖引入
)
// 某些没有发布过tag版本标识的依赖包,go.mod中记录的依赖版本信息就会出现上面 v0.0.0-20231201235250-de7065d80cb9 的格式, 由版本号、commit时间和commit的hash值组成
  • 依赖管理: 使用 go get 命令来添加、升级或删除依赖
go get example.com/othermodule@v1.2.3

模块使得Go语言在处理依赖和版本时更加简洁和安全。通过 go.mod 文件,Go自动解析和管理依赖,确保项目的稳定性。

  • go.sum文件: go.sum文件记录了模块依赖的校验和,用于确保模块的完整性和安全性

常见 go mod 命令

go build        对源代码和依赖的文件进行打包,生成可执行文件
go install 编译并安装包或依赖,安装到$GOPATH/bin下
go get 把依赖库添加到当前module中,如果本机从未下载先下载
go mod module相关命令
go mod init <pkg_name> 初始化项目
go mod tidy 扫描项目中的代码来添加未被记录的依赖至go.mod文件或从go.mod文件中删除不再被使用的依赖
go run 编译并运行程序
go test 执行测试代码
go tool 执行go自带的工具
go tool pprof 对cpu、内存和协程进行监控
go tool trace 跟踪协程的执行过程
go vet 检查代码中的静态错误
go env 查看go环境变量
go mod download 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit 编辑go.mod文件
go mod graph 打印模块依赖图
go mod vendor 将依赖复制到vendor下
go mod verify 校验依赖
go mod why 解释为什么需要依赖