# 第二阶段:Go语言核心概念 ## 学习目标 - 深入理解Go语言的核心特性 - 掌握面向对象编程在Go中的实现 - 理解并发编程模型 - 能够设计中等复杂度的Go程序 ## 详细学习内容 ### 2.1 指针与内存管理 ```go // 指针基础 var x int = 10 var p *int = &x *p = 20 // 修改x的值 // new函数分配内存 ptr := new(int) *ptr = 100 ``` ### 2.2 结构体与方法 ```go // 结构体定义 type Person struct { Name string Age int } // 方法定义 func (p Person) SayHello() string { return "Hello, " + p.Name } // 指针接收者 func (p *Person) SetAge(age int) { p.Age = age } ``` ### 2.3 接口与多态 ```go // 接口定义 type Shape interface { Area() float64 Perimeter() float64 } // 实现接口 type Rectangle struct { Width, Height float64 } func (r Rectangle) Area() float64 { return r.Width * r.Height } func (r Rectangle) Perimeter() float64 { return 2 * (r.Width + r.Height) } ``` ### 2.4 错误处理 ```go // 错误处理模式 func divide(a, b float64) (float64, error) { if b == 0 { return 0, errors.New("division by zero") } return a / b, nil } // 自定义错误类型 type MyError struct { Code int Message string } func (e MyError) Error() string { return fmt.Sprintf("Error %d: %s", e.Code, e.Message) } ``` ### 2.5 并发编程基础 ```go // goroutine func sayHello() { fmt.Println("Hello from goroutine") } go sayHello() // 启动goroutine // channel通信 ch := make(chan int) go func() { ch <- 42 // 发送数据 }() value := <-ch // 接收数据 ``` ### 2.6 包管理与模块化 ```go // go.mod文件示例 module github.com/username/project go 1.19 require ( github.com/gin-gonic/gin v1.9.0 github.com/go-sql-driver/mysql v1.7.0 ) ``` ## 练习项目 ### 项目1:学生信息管理系统 ```go type Student struct { ID int Name string Grade int Score float64 } // 实现增删改查功能 type StudentManager struct { students []Student } func (sm *StudentManager) AddStudent(s Student) error func (sm *StudentManager) FindStudentByID(id int) (Student, error) func (sm *StudentManager) UpdateStudent(s Student) error func (sm *StudentManager) DeleteStudent(id int) error ``` ### 项目2:并发文件下载器 ```go // 使用goroutine并发下载多个文件 func DownloadFiles(urls []string) error { var wg sync.WaitGroup errors := make(chan error, len(urls)) for _, url := range urls { wg.Add(1) go func(url string) { defer wg.Done() if err := downloadFile(url); err != nil { errors <- err } }(url) } wg.Wait() close(errors) // 处理错误 return nil } ``` ### 项目3:简单的聊天服务器 ```go // 使用channel实现消息广播 type ChatRoom struct { messages chan string clients []chan string } func (cr *ChatRoom) Broadcast(message string) func (cr *ChatRoom) Join() chan string ``` ## 推荐资源 ### 书籍 - 《Go语言实战》- 实践性强的进阶教材 - 《Go并发编程实战》- 深入理解并发 - 《Go语言高级编程》- 系统学习高级特性 ### 在线资源 - [Effective Go](https://go.dev/doc/effective_go) - Go官方最佳实践 - [Go标准库文档](https://pkg.go.dev/std) - 标准库详细说明 - [Go语言规范](https://go.dev/ref/spec) - 语言规范文档 ### 开源项目 - [Gin Web框架](https://github.com/gin-gonic/gin) - 学习Web开发 - [Cobra命令行库](https://github.com/spf13/cobra) - 学习CLI应用 ## 评估方式 ### 代码质量评估 1. **接口设计**:接口是否合理,是否遵循单一职责原则 2. **错误处理**:错误处理是否完整,是否提供有意义的错误信息 3. **并发安全**:并发程序是否正确处理竞态条件 ### 项目评估标准 - 学生管理系统:完整的CRUD操作,合理的错误处理 - 文件下载器:并发下载,进度显示,错误恢复 - 聊天服务器:多客户端支持,消息广播,连接管理 ### 时间安排(2-3周) - 第1-4天:指针、结构体、方法 - 第5-8天:接口、错误处理 - 第9-12天:并发编程基础 - 第13-18天:项目练习与优化 ## 常见问题 ### Q: 什么时候使用值接收者,什么时候使用指针接收者? A: 需要修改接收者状态时用指针,否则用值接收者 ### Q: channel的缓冲和非缓冲有什么区别? A: 缓冲channel可以存储多个值,非缓冲channel需要同步发送接收 ### Q: 如何避免goroutine泄漏? A: 使用context控制goroutine生命周期,确保所有goroutine都能正常退出 ## 下一步 完成本阶段学习后,进入第三阶段:实战模块开发