Go开发Skill golang

Go开发技能专注于使用Go语言进行高效、并发的编程,包括goroutines、channels和接口的设计与优化,适用于后端开发、性能调优和并发模式实现。关键词:Go语言、并发编程、goroutines、channels、接口设计、性能优化、错误处理、后端开发、软件开发。

后端开发 0 次安装 0 次浏览 更新于 3/12/2026

名称: golang 描述: 使用goroutines、channels和接口编写惯用的Go代码。用于Go开发、并发或性能优化。

Go开发

编写干净、并发、惯用的Go代码。

何时使用

  • 编写Go代码
  • 并发模式
  • 性能优化
  • 接口设计
  • Go模块管理

Go模式

并发

// Worker pool pattern
func workerPool(jobs <-chan Job, results chan<- Result, workers int) {
    var wg sync.WaitGroup
    for i := 0; i < workers; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for job := range jobs {
                results <- process(job)
            }
        }()
    }
    wg.Wait()
    close(results)
}

// Context for cancellation
func fetchWithTimeout(ctx context.Context, url string) ([]byte, error) {
    ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
    defer cancel()

    req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    return io.ReadAll(resp.Body)
}

错误处理

// Custom errors with context
type ValidationError struct {
    Field   string
    Message string
}

func (e *ValidationError) Error() string {
    return fmt.Sprintf("%s: %s", e.Field, e.Message)
}

// Error wrapping
if err != nil {
    return fmt.Errorf("failed to process user %d: %w", userID, err)
}

接口

// Small, focused interfaces
type Reader interface {
    Read(p []byte) error
}

type Writer interface {
    Write(p []byte) error
}

// Composition
type ReadWriter interface {
    Reader
    Writer
}

项目结构

project/
├── cmd/
│   └── app/
│       └── main.go
├── internal/
│   ├── handler/
│   └── service/
├── pkg/
│   └── utils/
├── go.mod
└── go.sum

测试

func TestProcess(t *testing.T) {
    tests := []struct {
        name    string
        input   string
        want    string
        wantErr bool
    }{
        {"valid input", "hello", "HELLO", false},
        {"empty input", "", "", true},
    }

    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            got, err := Process(tt.input)
            if (err != nil) != tt.wantErr {
                t.Errorf("error = %v, wantErr %v", err, tt.wantErr)
            }
            if got != tt.want {
                t.Errorf("got %v, want %v", got, tt.want)
            }
        })
    }
}

最佳实践

  • 优先使用组合而不是继承
  • 保持接口小(1-3个方法)
  • 显式处理错误
  • 使用context进行取消
  • 避免全局状态

示例

输入: “为此添加并发” 操作: 识别并行工作,添加goroutines并适当同步,处理错误

输入: “审查此Go代码” 操作: 检查错误处理、接口设计、并发安全性