phase3-practice.md 5.9 KB

第三阶段:Go语言实战模块

学习目标

  • 掌握Go语言在实际开发中的应用
  • 理解文件操作、网络编程、数据库连接
  • 能够开发完整的应用程序
  • 掌握测试和调试技巧

详细学习内容

3.1 文件I/O操作

// 文件读写
func readFile(filename string) (string, error) {
    data, err := os.ReadFile(filename)
    if err != nil {
        return "", err
    }
    return string(data), nil
}

func writeFile(filename, content string) error {
    return os.WriteFile(filename, []byte(content), 0644)
}

// 目录操作
func listFiles(dir string) ([]string, error) {
    entries, err := os.ReadDir(dir)
    if err != nil {
        return nil, err
    }
    
    var files []string
    for _, entry := range entries {
        files = append(files, entry.Name())
    }
    return files, nil
}

3.2 网络编程

// HTTP客户端
func httpGet(url string) (string, error) {
    resp, err := http.Get(url)
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()
    
    body, err := io.ReadAll(resp.Body)
    if err != nil {
        return "", err
    }
    return string(body), nil
}

// HTTP服务器
func startHTTPServer() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, World!")
    })
    
    http.ListenAndServe(":8080", nil)
}

// TCP服务器
func startTCPServer() {
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatal(err)
    }
    
    for {
        conn, err := ln.Accept()
        if err != nil {
            log.Println(err)
            continue
        }
        go handleConnection(conn)
    }
}

3.3 数据库操作

// MySQL连接
func connectDB() (*sql.DB, error) {
    db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname")
    if err != nil {
        return nil, err
    }
    
    if err := db.Ping(); err != nil {
        return nil, err
    }
    
    return db, nil
}

// CRUD操作
type User struct {
    ID   int
    Name string
    Age  int
}

func createUser(db *sql.DB, user User) error {
    _, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", user.Name, user.Age)
    return err
}

func getUserByID(db *sql.DB, id int) (User, error) {
    var user User
    err := db.QueryRow("SELECT id, name, age FROM users WHERE id = ?", id).Scan(&user.ID, &user.Name, &user.Age)
    return user, err
}

3.4 JSON/XML数据处理

// JSON序列化与反序列化
type Config struct {
    Host string `json:"host"`
    Port int    `json:"port"`
}

func saveConfig(config Config) error {
    data, err := json.Marshal(config)
    if err != nil {
        return err
    }
    return os.WriteFile("config.json", data, 0644)
}

func loadConfig() (Config, error) {
    data, err := os.ReadFile("config.json")
    if err != nil {
        return Config{}, err
    }
    
    var config Config
    err = json.Unmarshal(data, &config)
    return config, err
}

3.5 测试与调试

// 单元测试
func TestAdd(t *testing.T) {
    result := add(2, 3)
    if result != 5 {
        t.Errorf("Expected 5, got %d", result)
    }
}

// 基准测试
func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        add(1, 2)
    }
}

// 性能分析
func profileCPU() {
    f, err := os.Create("cpu.prof")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    
    pprof.StartCPUProfile(f)
    defer pprof.StopCPUProfile()
    
    // 执行需要分析的代码
}

练习项目

项目1:文件备份工具

// 实现增量备份功能
type BackupManager struct {
    sourceDir string
    backupDir string
}

func (bm *BackupManager) Backup() error
func (bm *BackupManager) Restore(backupName string) error
func (bm *BackupManager) ListBackups() ([]string, error)

项目2:Web爬虫

// 并发爬取网页内容
type Crawler struct {
    visited map[string]bool
    mutex   sync.Mutex
}

func (c *Crawler) Crawl(url string, depth int) ([]string, error)
func (c *Crawler) extractLinks(html string) []string

项目3:数据库CRUD应用

// 完整的用户管理系统
type UserService struct {
    db *sql.DB
}

func (us *UserService) CreateUser(user User) error
func (us *UserService) GetUser(id int) (User, error)
func (us *UserService) UpdateUser(user User) error
func (us *UserService) DeleteUser(id int) error
func (us *UserService) ListUsers() ([]User, error)

推荐资源

书籍

  • 《Go Web编程》- Web开发实战
  • 《Go语言编程》- 综合应用
  • 《Go语言标准库》- 标准库详解

在线资源

工具

评估方式

功能完整性测试

  1. 文件备份工具:增量备份、恢复功能、备份列表
  2. Web爬虫:并发爬取、链接提取、去重处理
  3. 数据库应用:完整CRUD操作、事务处理

代码质量评估

  • 错误处理完整性
  • 代码可读性和可维护性
  • 性能优化程度
  • 测试覆盖率

时间安排(3-4周)

  • 第1-5天:文件操作与网络编程
  • 第6-10天:数据库操作与数据处理
  • 第11-15天:测试与调试技巧
  • 第16-21天:项目练习与优化

常见问题

Q: 如何处理大文件读写?

A: 使用bufio.Scanner或分块读取,避免内存溢出

Q: 数据库连接池如何配置?

A: 使用sql.DB的SetMaxOpenConns、SetMaxIdleConns等方法配置

Q: 如何调试并发程序?

A: 使用race detector:go run -race main.go

下一步

完成本阶段学习后,进入第四阶段:完整项目实践