Go 语言学习笔记
更新日期:2026-08-06
一、教程下载与运行
1. 下载官方交互式教程
Go 官方提供了交互式学习教程 Tour of Go,可以下载到本地运行。
|
|
安装完成后,在终端执行:
|
|
启动本地教程服务,然后在浏览器访问终端提示的地址。
官方在线教程:
二、包、变量和函数
1. 常见的包
Go 的标准库提供了大量开箱即用的功能。
| 包名 | 用途 |
|---|---|
fmt |
格式化输入输出 |
math |
数学计算 |
strings |
字符串处理 |
time |
时间和日期处理 |
os |
操作系统相关功能 |
net/http |
HTTP 客户端和服务器 |
encoding/json |
JSON 编解码 |
2. 导入包
方式一:逐个导入
|
|
方式二:分组导入
推荐使用分组导入:
|
|
3. 导出名称
Go 使用首字母大小写来控制标识符是否可以被其他包访问。
首字母大写:导出
首字母大写的名称可以被其他包访问。
|
|
例如:
|
|
其中 Pi 首字母大写,因此可以从 math 包外部访问。
首字母小写:未导出
首字母小写的名称只能在当前包内部使用。
|
|
外部无法访问。
核心规则:
大写开头→ 导出 → 其他包可以访问小写开头→ 未导出 → 仅当前包可以访问
4. 函数定义
Go 函数的基本格式:
|
|
例如:
|
|
参数类型简写
如果连续多个参数类型相同,可以只写最后一个参数的类型:
|
|
这与下面的写法完全等价:
|
|
5. 变量
Go 使用 var 声明变量。
|
|
如果变量声明时没有进行初始化,Go 会自动赋予该变量对应类型的零值。
| 类型 | 零值 |
|---|---|
| 整数类型 | 0 |
| 浮点类型 | 0 |
bool |
false |
string |
"" |
| 指针 | nil |
| 切片 | nil |
| Map | nil |
| Channel | nil |
| Function | nil |
| Interface | nil |
例如:
|
|
6. 短变量声明
在函数内部,可以使用 := 进行短变量声明。
|
|
:= 会同时完成:
- 创建变量
- 推断变量类型
- 赋值
例如:
|
|
注意
:= 不能用于函数外部的包级变量声明。
错误:
|
|
正确:
|
|
三、Go 基本类型
Go 的基本类型主要包括布尔、字符串、整数、浮点数和复数。
| 类别 | 类型 | 别名 / 关联 | 说明 |
|---|---|---|---|
| 布尔 | bool |
- | true 或 false |
| 字符串 | string |
- | 不可变字节序列,通常存储 UTF-8 编码文本 |
| 有符号整数 | int |
- | 平台相关,通常为 32 位或 64 位 |
int8 |
- | -128 ~ 127 |
|
int16 |
- | -32768 ~ 32767 |
|
int32 |
rune |
常用于表示 Unicode 码点 | |
int64 |
- | 64 位有符号整数 | |
| 无符号整数 | uint |
- | 平台相关,与 int 位宽通常相同 |
uint8 |
byte |
0 ~ 255,常用于表示原始字节 |
|
uint16 |
- | 0 ~ 65535 |
|
uint32 |
- | 32 位无符号整数 | |
uint64 |
- | 64 位无符号整数 | |
uintptr |
- | 足以存储指针地址的无符号整数 | |
| 浮点数 | float32 |
- | 单精度浮点数 |
float64 |
- | 双精度浮点数,通常优先使用 | |
| 复数 | complex64 |
- | 实部和虚部均为 float32 |
complex128 |
- | 实部和虚部均为 float64 |
byte 和 rune
这两个类型在 Go 中非常常见:
|
|
因此:
|
|
分别可以理解为:
byte→ 一个字节,常用于处理二进制数据rune→ 一个 Unicode 码点,常用于处理字符
例如:
|
|
四、类型转换
Go 不会自动进行大多数数值类型之间的隐式转换。
需要使用:
|
|
其中:
T是目标类型v是需要转换的值
例如:
|
|
也可以:
|
|
注意:浮点数转换为整数时,小数部分会被截断。
1. 查看变量类型
可以使用 fmt.Printf 的 %T 查看变量类型:
|
|
例如:
|
|
输出:
|
|
五、常量
Go 使用 const 定义常量:
|
|
常量创建后不能重新赋值:
|
|
常量不能使用 :=
错误:
|
|
正确:
|
|
六、常见框架与库
1. Web 框架 / HTTP 路由
Go Web 开发中常见的选择:
| 框架 / 库 | 特点 | 推荐场景 |
|---|---|---|
| Gin | 高性能、简洁、生态成熟 | REST API、微服务 |
| Echo | API 简洁、中间件丰富 | REST API |
| Fiber | 类似 Express.js、基于 fasthttp |
Node.js 转 Go、性能敏感场景 |
| Chi | 轻量、兼容 net/http |
希望尽量使用标准库 |
net/http |
Go 官方标准库 | 学习 HTTP、简单 Web 服务 |
入门建议
对于 Go 初学者,可以按照下面的顺序:
|
|
先理解 Go 标准库的 HTTP 工作方式,再使用 Web 框架,可以避免只会调用框架 API 而不了解底层原理。
七、数据库相关
| 包 / 工具 | 类型 | 说明 |
|---|---|---|
| GORM | ORM | 功能完整、上手简单 |
| sqlx | SQL 扩展 | 基于 database/sql,更接近原生 SQL |
| ent | ORM / 代码生成 | 类型安全,适合复杂数据模型 |
| sqlc | SQL 代码生成 | 根据 SQL 自动生成类型安全的 Go 代码 |
| go-redis | Redis 客户端 | Go 生态中常用的 Redis 客户端 |
| rueidis | Redis 客户端 | 高性能 Redis 客户端 |
学习建议
如果已经有 MySQL、MyBatis-Plus 等 Java 开发经验,可以重点理解 Go 中:
|
|
同时学习:
|
|
八、配置、日志和工具
| 包 | 用途 |
|---|---|
| Viper | 配置管理,支持 YAML、JSON、环境变量等 |
| Cobra | CLI 命令行工具 |
| Zap | 高性能日志 |
| Zerolog | 高性能结构化日志 |
| Logrus | 常见日志库 |
| Testify | 测试断言、Mock |
| Validator | 结构体参数校验 |
| Google UUID | UUID 生成 |
九、微服务与 RPC
1. gRPC + Protocol Buffers
Go 微服务中非常常见的 RPC 技术组合:
|
|
主要特点:
- 高性能
- 强类型
- 自动生成客户端和服务端代码
- 适合微服务内部通信
2. 常见 Go 微服务框架
| 框架 / 工具 | 特点 |
|---|---|
| gRPC + Protobuf | 主流 RPC 技术方案 |
| go-zero | 国内使用较多的微服务框架 |
| Kratos | 微服务框架 |
| go-kit | 微服务工具集,更偏底层库 |
十、其他常用工具包
| 包 | 用途 |
|---|---|
gorilla/websocket |
WebSocket 通信 |
robfig/cron |
定时任务 |
excelize |
Excel 文件读写 |
golang-jwt/jwt |
JWT 身份认证 |
bcrypt |
密码哈希 |
argon2 |
密码哈希 |
samber/lo |
类似 Lodash 的工具函数 |
resty |
HTTP 客户端 |
十一、第一课学习重点
第一课暂时不要急着记忆大量第三方框架,优先掌握 Go 语言基础。
建议按照下面的顺序学习:
|
|
第一课核心目标:
能够独立看懂一个简单 Go 程序,并理解
package、import、func、var、:=、const以及 Go 基本类型的含义。
十二、一个完整示例
|
|
这个程序综合使用了:
packageimportconstfunc:=intstring- 函数调用
fmt.Printlnfmt.Printf%T类型格式化
十三、第一课总结
这一课主要认识 Go 的基础语法:
| 知识点 | 关键语法 |
|---|---|
| 包 | package |
| 导入 | import |
| 导出 | 首字母大写 |
| 函数 | func |
| 变量 | var |
| 短变量 | := |
| 常量 | const |
| 类型转换 | T(v) |
| 查看类型 | %T |
| 输出 | fmt.Println() / fmt.Printf() |
下一阶段重点:
|
|