提供地道 Go 设计模式与最佳实践,帮助编写健壮高效且易维护的应用
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "golang-patterns" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/docs/tr/skills/golang-patterns/SKILL.md 2. 保存为 ~/.claude/skills/golang-patterns/SKILL.md 3. 装好后重载技能,告诉我可以用了
我在用 Go 构建一个需要并发处理任务的服务。请根据场景对比 worker pool、pipeline、fan-out/fan-in 等常见并发模式,说明各自适用条件、优缺点,并给出简洁示例代码与推荐方案。
输出包含多种 Go 并发模式的对比、适用建议和示例代码的实践指南。
请审查下面这段 Go 代码,从命名、错误处理、接口设计、包结构和可维护性角度指出不符合 Go 惯例的问题,并重构为更地道的写法,附修改说明。
输出包含问题清单、重构后的 Go 代码,以及符合最佳实践的修改说明。
我要启动一个中型 Go 项目,请推荐符合社区惯例的目录结构、配置管理、日志、依赖注入、测试组织方式,并说明如何随着项目增长保持可维护性。
输出包含 Go 项目结构建议、关键工程约定与长期维护实践。
Sağlam, verimli ve bakımı kolay uygulamalar oluşturmak için idiomatic Go desenleri ve en iyi uygulamalar.
Go, zekiceden ziyade basitliği tercih eder. Kod açık ve okunması kolay olmalıdır.
// İyi: Açık ve doğrudan
func GetUser(id string) (*User, error) {
user, err := db.FindUser(id)
if err != nil {
return nil, fmt.Errorf("get user %s: %w", id, err)
}
return user, nil
}
// Kötü: Aşırı zeki
func GetUser(id string) (*User, error) {
return func() (*User, error) {
if u, e := db.FindUser(id); e == nil {
return u, nil
} else {
return nil, e
}
}()
}
Türleri, sıfır değerinin başlatma olmadan hemen kullanılabilir olacağı şekilde tasarlayın.
// İyi: Sıfır değer kullanışlıdır
type Counter struct {
mu sync.Mutex
count int // sıfır değer 0'dır, kullanıma hazırdır
}
func (c *Counter) Inc() {
c.mu.Lock()
c.count++
c.mu.Unlock()
}
// İyi: bytes.Buffer sıfır değerle çalışır
var buf bytes.Buffer
buf.WriteString("hello")
// Kötü: Başlatma gerektirir
type BadCounter struct {
counts map[string]int // nil map panic verir
}
Fonksiyonlar interface parametreleri kabul etmeli ve somut tipler döndürmelidir.
// İyi: Interface kabul eder, somut tip döndürür
func ProcessData(r io.Reader) (*Result, error) {
data, err := io.ReadAll(r)
if err != nil {
return nil, err
}
return &Result{Data: data}, nil
}
// Kötü: Interface döndürür (implementasyon detaylarını gereksiz yere gizler)
func ProcessData(r io.Reader) (io.Reader, error) {
// ...
}
// İyi: Hataları bağlamla sarmalayın
func LoadConfig(path string) (*Config, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("load config %s: %w", path, err)
}
var cfg Config
if err := json.Unmarshal(data, &cfg); err != nil {
return nil, fmt.Errorf("parse config %s: %w", path, err)
}
return &cfg, nil
}
// Domain'e özgü hataları tanımlayın
type ValidationError struct {
Field string
Message string
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("validation failed on %s: %s", e.Field, e.Message)
}
// Yaygın durumlar için sentinel hatalar
var (
ErrNotFound = errors.New("resource not found")
ErrUnauthorized = errors.New("unauthorized")
ErrInvalidInput = errors.New("invalid input")
)
func HandleError(err error) {
// Belirli bir hatayı kontrol et
if errors.Is(err, sql.ErrNoRows) {
log.Println("No records found")
return
}
// Hata tipini kontrol et
var validationErr *ValidationError
if errors.As(err, &validationErr) {
log.Printf("Validation error on field %s: %s",
validationErr.Field, validationErr.Message)
return
}
// Bilinmeyen hata
log.Printf("Unexpected error: %v", err)
}
// Kötü: Boş tanımlayıcı ile hatayı göz ardı etmek
result, _ := doSomething()
// İyi: Hatayı işleyin veya neden göz ardı edildiğini açıkça belgelendirin
result, err := doSomething()
if err != nil {
return err
}
// Kabul edilebilir: Hata gerçekten önemli olmadığında (nadir)
_ = writer.Close() // En iyi çaba temizliği, hata başka yerde loglanır
func WorkerPool(jobs <-chan Job, results chan<- Result, numWorkers int) {
var wg sync.WaitGroup
for i := 0; i < numWorkers; i++ {
wg.Add(1)
go func() {
…
通过双评审智能体对结果进行对抗式校验,提升输出发布前的可靠性
提供地道 Kotlin 模式与最佳实践,帮助构建健壮高效且易维护的应用。