1
0

phase2-core.md 4.7 KB

第二阶段:Go语言核心概念

学习目标

  • 深入理解Go语言的核心特性
  • 掌握面向对象编程在Go中的实现
  • 理解并发编程模型
  • 能够设计中等复杂度的Go程序

详细学习内容

2.1 指针与内存管理

// 指针基础
var x int = 10
var p *int = &x
*p = 20 // 修改x的值

// new函数分配内存
ptr := new(int)
*ptr = 100

2.2 结构体与方法

// 结构体定义
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 接口与多态

// 接口定义
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 错误处理

// 错误处理模式
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 并发编程基础

// 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.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:学生信息管理系统

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:并发文件下载器

// 使用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:简单的聊天服务器

// 使用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语言高级编程》- 系统学习高级特性

在线资源

开源项目

评估方式

代码质量评估

  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都能正常退出

下一步

完成本阶段学习后,进入第三阶段:实战模块开发