Go中用策略模式优化算法选择,核心是将算法封装为可互换类型并通过统一接口切换行为;定义窄小策略接口、为每种算法实现该接口、用工厂或配置驱动选择、结合依赖注入提升可测性与可替换性。

在 Go 中用策略模式优化算法选择,核心是把不同算法封装成独立、可互换的类型,让调用方不关心具体实现,只通过统一接口切换行为。这样新增算法不用改原有逻辑,维护性和扩展性明显提升。
定义策略接口,统一算法契约
先设计一个清晰、窄小的接口,只暴露算法必需的方法。比如处理数据的策略:
type Processor interface {
Process(data []byte) ([]byte, error)
}
接口越简单,实现越灵活,也越容易测试。避免把日志、配置、上下文等无关职责塞进来。
为每种算法实现策略接口
每个具体算法单独写一个结构体,实现 Processor 接口。例如:
立即学习“go语言免费学习笔记(深入)”;
每个实现只专注一件事,没有条件分支,也没有 if-else 判断该用哪个算法——那是上层的事。
用工厂或配置驱动策略选择
把“选哪个策略”的逻辑集中管理,避免散落在业务代码里。常见方式有:
- 按字符串名注册策略(如
map[string]Processor),运行时查表获取 - 用配置文件(TOML/YAML)指定算法类型,启动时初始化对应策略实例
- HTTP 请求头或查询参数决定策略(适合 API 网关类场景)
示例片段:
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 实现,快速验证逻辑;上线后也能热插拔策略,无需重编译。










