9.3 Go代码示例
go
复制代码
package main

import (
    "context"
    "fmt"
    "sync"
    "time"
)

// 结构体定义
type Server struct {
    addr     string
    mu       sync.RWMutex
    requests int
}

// 方法:实现接口
func (s *Server) HandleRequest(ctx context.Context, request string) (string, error) {
    select {
    case <-ctx.Done():
        return "", ctx.Err()
    default:
        s.mu.Lock()
        s.requests++
        s.mu.Unlock()
        
        // 模拟处理
        time.Sleep(100 * time.Millisecond)
        return fmt.Sprintf("Processed: %s", request), nil
    }
}

// 接口定义
type Handler interface {
    HandleRequest(ctx context.Context, request string) (string, error)
}

// 泛型函数(Go 1.18+)
func Map[T any, U any](items []T, f func(T) U) []U {
    result := make([]U, len(items))
    for i, item := range items {
        result[i] = f(item)
    }
    return result
}

// 并发:goroutine和channel
func worker(id int, jobs <-chan int, results chan<- int, wg *sync.WaitGroup) {
    defer wg.Done()
    for job := range jobs {
        fmt.Printf("Worker %d processing job %d\n", id, job)
        results <- job * 2
    }
}

func main() {
    // 接口使用
    var h Handler = &Server{addr: "localhost:8080"}
    
    ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
    defer cancel()
    
    result, err := h.HandleRequest(ctx, "hello")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println(result)
    
    // 泛型使用
    numbers := []int{1, 2, 3, 4, 5}
    doubled := Map(numbers, func(n int) int { return n * 2 })
    fmt.Println(doubled)
    
    // 并发模式:worker pool
    const numWorkers = 3
    const numJobs = 10
    
    jobs := make(chan int, numJobs)
    results := make(chan int, numJobs)
    var wg sync.WaitGroup
    
    for w := 1; w <= numWorkers; w++ {
        wg.Add(1)
        go worker(w, jobs, results, &wg)
    }
    
    for j := 1; j <= numJobs; j++ {
        jobs <- j
    }
    close(jobs)
    
    wg.Wait()
    close(results)
    
    for result := range results {
        fmt.Println("Result:", result)
    }
}