数据操作相关
| 包 | 简介 |
|---|---|
| strings | 字符串操作 |
| strconv | 字符串类型转换 |
| time | 时间测量及显示 |
| math | 数学函数、随机数 |
| container | 数据结构 |
| regexp | 正则表达式 |
| bytes | 字节操作 |
| hash | hash函数 |
| index | 字符串搜索 |
| sort | 排序 |
| text | 文本操作 |
| cmp | 比较值相等 |
| iter | 迭代器 |
| maps | map操作 |
| slices | 切片操作 |
| structs | 结构体 |
| unique | 相同的值在内存中只存一次 |
IO、编码相关
| 包 | 简介 |
|---|---|
| archive | 打包 |
| compress | 压缩 |
| encoding | 编码,json等 |
| crypto | 加密 |
| fmt | 标准IO |
| io | IO接口、实用工具 |
| bufio | 缓冲区IO |
| os | 操作系统函数,读文件等 |
| database | 数据库驱动 |
| flag | 命令行参数解析 |
| html | html转译 数据驱动模板 |
| mime | 电子邮件 |
| image | 图像操作 |
| net | 网络,http、rpc等实现 |
| path | 斜杠分割路径 |
| expvar | 公共变量 |
| unicode | unicode处理 |
| log | 日志 |
控制、调试相关
| 包 | 简介 |
|---|---|
| builtin | 基础数据类型、基础函数,不需要导入 |
| reflect | 反射 |
| unsafe | 直接操作内存 |
| weak | 弱引用,不阻止内存回收 |
| arena | 手动管理内存 |
| context | 协程上下文 |
| errors | 错误处理 |
| sync | 同步单元 |
| runtime | 运行时信息,debug profile |
| debug | 读取调试信息、解析Go符号表等 |
| embed | 编译时将资源文件一起打包 |
| plugin | 动态模块加载 |
| syscall | 系统调用 |
| testing | 测试工具 |
第三方库
| 包 | 简介 |
|---|---|
| Gin | Web框架,RESTful |
| Fiber | Web框架,基于Fasthttp,高性能 |
| Gorilla MUX | HTTP路由管理 |
| istio | 服务网格 |
| go-zero | 微服务组件 |
| go-kit | 微服务组件 |
| GORM | ORM(对象关系映射)库 |
| Cobra | 命令行工具,替代内置包flag |
| Viper | 读取配置 |
| Logrus | 日志库 |
| testify | 测试框架 |
| GoConvey | 测试框架 |
包管理
创建项目
> go mod init awesomeProject
会自动创建 go.mod 文件
module awesomeProject
go 1.24.3
创建代码文件 main.go
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
// 创建默认的 gin 引擎
r := gin.Default()
// 定义一个简单的路由
r.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello, Gin!",
})
})
// 启动服务器
err := r.Run(":8080")
if err != nil {
return
}
}
构建并运行
> go mod tidy
更新 go.mod 依赖项,会根据代码中的 import 下载并引入依赖包,并移除不需要的包
go.mod 示例
module awesomeProject2
go 1.24.3
require github.com/gin-gonic/gin v1.10.1
require (
github.com/bytedance/sonic v1.13.3 // indirect
github.com/bytedance/sonic/loader v0.2.4 // indirect
)
> go build
构建,生成可执行文件
vendor
> go mod vendor
将第三方依赖包存入工程中的vendor目录,go build会优先从vendor中查找依赖项。更新vendor目录需要重复执行指令。
依赖包版本
版本格式为 v(major).(minor).(patch),比如 v1.2.3。
一般认为,major版本更新不向后兼容,minor版本更新向后兼容,而 import 会区分major版本,比如
import "github.com/pelletier/go-toml/v2"
即一个项目可以同时使用一个依赖包的两个版本。
go mod tidy 版本选择:
- 直接依赖包,即代码中 import 的包,会选择该major版本的最新小版本
- 间接依赖包,即 import 的包依赖的其他包,会选择最高的显式依赖版本,比如,B依赖D的 1.0.0,C依赖D的1.2.3,则D选择1.2.3
更新版本:
> go get -u
更新minor版本,比如 v1.2.3 更新到 v1.3.1
> go get -u=patch
只更新patch版本,比如 v1.2.3 更新到 v1.2.5
查看可更新列表:
> go list -u -m all
replace:
替换依赖库,比如原库不存在,或者修复原库的bug,可在 go.mod 中使用 replace 替换
replace example.com/theirmodule v1.2.3 => example.com/myfork/theirmodule v1.2.3-fixed
exclude:
排除依赖库,可用于排除间接依赖但实际不会被加载的包
exclude example.com/theirmodule v1.3.0