Go技巧三则:让代码更优雅
Go语言以其简洁著称,但简洁不等于简单。掌握几个关键技巧,能让你的代码更上一层楼。
1. 接口即契约:小接口大用途
Go的接口设计哲学是“越小越好”。一个接口只包含1-2个方法是最佳实践:
type Reader interface {
Read(p []byte) (n int, err error)
}
这种设计让接口更容易实现,组合更灵活。标准库遍地都是这种例子。
2. 错误即值:优雅处理错误
Go的错误处理常被吐槽,但利用“错误即值”的理念,可以写出优雅代码:
type ErrWriter struct {
w io.Writer
err error
}
func (ew *ErrWriter) Write(data []byte) {
if ew.err != nil {
return
}
_, ew.err = ew.w.Write(data)
}
将错误作为结构体字段,避免重复的if err != nil检查。
3. 并发模式:工作池
利用goroutine和channel实现高效工作池:
jobs := make(chan int, 100)
results := make(chan int, 100)
// 启动worker
for w := 0; w < 3; w++ {
go worker(jobs, results)
}
这种模式既控制了并发度,又避免了资源耗尽。
4. 小贴士:使用json.RawMessage
处理动态JSON时,json.RawMessage能延迟解析:
type Message struct {
Type string `json:"type"`
Data json.RawMessage `json:"data"`
}
先解析类型,再根据类型解析具体数据,灵活处理异构JSON。
记住:Go的优雅在于简单、直接、可读。过度设计反而是种浪费。