跳转至

模块和包


更新于 2023-11-27

模块

模块可以包含若干个包

模块路径

模块路径标识一个模块
模块路径定义在go.mod中
go.mod所在的目录即模块的根目录
模块路径包含仓库路径(网络导入需要路径)

包含源文件
属于一个模块
路径是模块路径包路径

示例

模块名 "golang.org/x/net"
包在"html"目录
包的路径是 "golang.org/x/net/html"

go.mod

Text Only
1
2
3
4
5
6
7
8
9
module example.com/my/thing  //模块名

go 1.12                       //当前golang版本

require example.com/other/thing v1.0.2   //依赖外部包
require example.com/new/thing/v2 v2.3.4
exclude example.com/old/thing v1.2.3
replace example.com/bad/thing v1.4.5 => example.com/good/thing v1.4.5 //包替换
retract [v1.9.0, v1.9.5]

列出本地包

Bash
1
2
3
4
5
go list
# 列出本地包
go list ...
# 搜索本地包
go list ...xxx...

关键字

关键字 作用
package 说明该源文件是属于哪个包
import 导入依赖的其它包

包导入

包名匹配导入路径的最后一段

Go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
//为导入包设置别名
import(
    pa "pkga"
    pb "pkgb"
)

//可直接引用包函数
import(
    . "pkga"
)

//调用包初始化,但不引入包
import(
    _ "pkga"
)

import (
    "github.com/username/project" //通过project引用包
    "rsc.io/quote"
)

包的初始化

包按导入顺序初始化
每个包可以包含init函数,初始化时自动执行

Go
1
2
3
func init(){
    do something
}

main包

当你使用main包时,程序将生成独立的可执行文件
但当程序不是main包的一部分时,Go 不会生成二进制文件。它生成包存档文件(扩展名为 .a 的文件)

包缓存

在 Go 里,go mod 下载的依赖会缓存在本地的 module cache 目录,默认在:$GOPATH/pkg/mod
以及下载的 .zip 包会放在:$GOPATH/pkg/mod/cache/download

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#清空
go clean -modcache
#直接删除整个module cache,相当于清空 $GOPATH/pkg/mod 目录。

rm -rf $(go env GOPATH)/pkg/mod
rm -rf $(go env GOPATH)/pkg/sumdb
#手动删除部分缓存

go mod tidy
go mod download
#重新下载依赖

参考

go-mod官方文档