Skip to content

模块和包 ​


更新于 2023-11-27

模块 ​

模块可以包含若干个包

模块路径 ​

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

包 ​

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

示例 ​

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

go.mod ​

txt
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]

列出本地包 ​

shell
go list
# 列出本地包
go list ...
go list -m all
#查看依赖下载路径
go list -m -json github.com/gin-gonic/gin
# 搜索本地包
go list ...xxx...

关键字 ​

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

包导入 ​

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

go
//为导入包设置别名
import(
    pa "pkga"
    pb "pkgb"
)

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

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

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

包的初始化 ​

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

go
func init(){
    do something
}

main包 ​

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

包缓存 ​

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

shell
#清空
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
#重新下载依赖

github包版本 ​

Go模块(go mod)系统会从GitHub等远程仓库拉取代码
具体拉分支/tag/commit取决于go.mod中的引用的。

版本来源 ​

来源类型示例说明
语义化版本(tag)v1.2.3最常见来自Git标签(git tag v1.2.3)
分支(branch)master/main,/develop等通常通过 @branch 明确指定
提交哈希(commit)@<commit-sha>精确指定某个commit(常用于测试或临时修改)

版本选择 ​

shell
go get github.com/gin-gonic/gin
# 拉取V*格式的tag, 默认会选择最新
# 可以在go.mod里指定版本, 例如`require github.com/user/repo v1.3.2`

go get github.com/gin-gonic/gin@develop
#在go.mod中生成一个伪版本号
#v0.0.0-20251006abcdef123456
#v0.0.0 表示没有正式 release tag;
# 20251006是时间;
#abcdef123456 是 commit 的前缀。

go get github.com/gin-gonic/gin@abcdef123456
#根据commmit ID拉取指定分支

私有仓库拉取 ​

Go模块本质上通过git clone或git fetch拉取源码
私有仓库依赖需要提前配置认证凭据(SSH key 或 HTTPS token) 并关闭官方代理(proxy.golang.org 不支持私有仓库)

shell
export GOPRIVATE=github.com/myorg/*
# GOPRIVATE控制哪些模块被认为是私有的;

export GONOPROXY=github.com/myorg/*
# GONOPROXY告诉Go不走公共代理;

export GONOSUMDB=github.com/myorg/*
# GONOSUMDB告诉Go不校验公有SumDB。

SSH拉取 ​

确保ssh可以访问代码仓库

HTTPS + Token拉取 ​

shell
#在本地配置 ~/.gitconfig
[url "https://<TOKEN>@github.com/"]
    insteadOf = https://github.com/

#CI/CD中配置
export GIT_ASKPASS=echo
export GIT_CRED_HELPER=
export GIT_TERMINAL_PROMPT=0
git config --global url."https://<TOKEN>@github.com/".insteadOf "https://github.com/"

参考 ​

go-mod官方文档