文档
Go 语言毕设入门教程
前言
Go 语言在国内互联网大厂(字节跳动、腾讯、B站)广泛使用,毕选用 Go 写后端能体现扎实的工程能力。本教程带你快速掌握 Go 的核心概念。
第一章:Go 的哲学 — 少即是多
Go 的设计哲学是 简洁实用:
- 没有类继承 → 用组合 + interface
- 没有泛型(Go 1.18 以前)→ 简洁但有局限
- 没有异常 → 用 error 返回值
- 只有 25 个关键字
// ❌ Java 风格
try {
result = doSomething();
} catch (Exception e) {
log.error(e);
}
// ✅ Go 风格 — 显式处理每个错误
result, err := doSomething()
if err != nil {
log.Printf("doSomething failed: %v", err)
return err
}
第二章:指针与内存
Go 有指针但没有指针运算,安全且高效:
// 值传递 — 拷贝整个结构体
func updateBad(u User) {
u.Name = "new" // 不影响外部
}
// 指针传递 — 零拷贝
func updateGood(u *User) {
u.Name = "new" // 修改原值
}
// 常见模式:构造函数返回指针
func NewUser(name string) *User {
return &User{Name: name, CreatedAt: time.Now()}
}
毕设实践:DTO 传值,模型传指针,大切片传指针。
第三章:并发才是杀手锏
// 经典模式:Worker Pool
func workerPool(jobs <-chan Job, results chan<- Result, numWorkers int) {
var wg sync.WaitGroup
for i := 0; i < numWorkers; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for job := range jobs {
results <- process(job)
}
}()
}
wg.Wait()
close(results)
}
毕设场景:
- 批量数据处理(论文数据分析)
- 并发爬虫(数据采集模块)
- 实时推送(WebSocket 服务)
第四章:结构体标签与验证
type Student struct {
ID int `json:"id" gorm:"primaryKey"`
Name string `json:"name" binding:"required" gorm:"size:50"`
Email string `json:"email" binding:"required,email" gorm:"uniqueIndex"`
Major string `json:"major"`
}
结构体标签是 Go 的元编程方式,一个结构体可以通过标签同时描述 JSON 序列化、字段验证、数据库映射。
第五章:项目结构
go-project/
├── cmd/
│ └── server/
│ └── main.go # 入口
├── internal/
│ ├── handler/ # HTTP 处理器(Controller)
│ ├── service/ # 业务逻辑
│ ├── repository/ # 数据访问
│ └── model/ # 数据模型
├── config/
├── go.mod
└── go.sum
internal/ 下的包无法被外部项目引用,这是 Go 的访问控制机制。
思考题
- goroutine 和 OS 线程的本质区别是什么?
- channel 关闭后还能读取吗?往已关闭的 channel 写数据会怎样?
- Go 的 GC 如何做到 STW(Stop The World)低于 1ms?