Go中用策略模式优化算法选择,核心是将算法封装为可互换类型并通过统一接口切换行为;定义窄小策略接口、为每种算法实现该接口、用工厂或配置驱动选择、结合依赖注入提升可测性与可替换性。
在 Go 中用策略模式优化算法选择,核心是把不同算法封装成独立、可互换的类型,让调用方不关心具体实现,只通过统一接口切换行为。这样新增算法不用改原有逻辑,维护性和扩展性明显提升。
先设计一个清晰、窄小的接口,只暴露算法必需的方法。比如处理数据的策略:
type Processor interface {
Process(data []byte) ([]byte, error)
}
接口越简单,实现越灵活,也越容易测试。避免把日志、配置、上下文等无关职责塞进来。
每个具体算法单独写一个结构体,实现 Processor 接口。例如:
每个实现只专注一件事,没有条件分支,也没有 if-else 判断该用哪个算法——那是上层的事。
把“选哪个策略”的逻辑集中管理,避免散落在业务代码里。常见方式有:
map[string]Processor),运行时查表获取示例片段:
processors := map[string]Processor{
"base64": &Base64Encoder{},
"sha256": &SHA256Hasher{},
"gzip": &GzipCompressor{},
}
proc := processors["sha256"]
result, _ := proc.Process
([]byte("hello"))
把策略作为字段注入到业务结构体中,而不是在方法内部 new 出来:
type DataService struct {
processor Processor // 依赖抽象,非具体类型
}
func (s *DataService) Handle(data []byte) ([]byte, error) {
return s.processor.Process(data)
}
单元测试时可传入 mock 实现,快速验证逻辑;上线后也能热插拔策略,无需重编译。