Go语言中可用函数式编程实现策略模式,通过定义SortStrategy函数类型并结合一等函数,使排序算法可动态切换;具体通过Sorter结构体持有策略,支持运行时替换算法,如使用AscendingSort、DescendingSort或匿名函数作为策略,实现灵活、解耦的排序逻辑。

在Go语言中,策略模式通常用于将算法的实现与使用解耦,让不同算法可以相互替换而不影响客户端。传统的策略模式依赖接口和结构体,但Go支持一等函数(first-class functions),这使得我们可以用函数式的方式简洁地实现策略模式。
函数作为策略类型
定义一个函数类型来表示策略,是函数式实现的核心。比如,我们想实现不同的排序策略:
type SortStrategy func([]int)
这个函数类型可以接收任何符合签名的函数,比如升序、降序排序:
立即学习“go语言免费学习笔记(深入)”;
func AscendingSort(data []int) {
sort.Ints(data)
}
func DescendingSort(data []int) {
sort.Sort(sort.Reverse(sort.IntSlice(data)))
}
上下文使用策略函数
定义一个上下文结构体,持有当前策略,并提供切换和执行能力:
type Sorter struct {
strategy SortStrategy
}
func (s *Sorter) SetStrategy(strategy SortStrategy) {
s.strategy = strategy
使用模板与程序分离的方式构建,依靠专门设计的数据库操作类实现数据库存取,具有专有错误处理模块,通过 Email 实时报告数据库错误,除具有满足购物需要的全部功能外,成新商城购物系统还对购物系统体系做了丰富的扩展,全新设计的搜索功能,自定义成新商城购物系统代码功能代码已经全面优化,杜绝SQL注入漏洞前台测试用户名:admin密码:admin888后台管理员名:admin密码:admin888
}
func (s *Sorter) Sort(data []int) {
if s.strategy != nil {
s.strategy(data)
}
}
使用时可以动态切换策略:
sorter := &Sorter{}
data := []int{3, 1, 4, 1, 5}
sorter.SetStrategy(AscendingSort)
sorter.Sort(data) // [1 1 3 4 5]
sorter.SetStrategy(DescendingSort)
sorter.Sort(data) // [5 4 3 1 1]
匿名函数作为临时策略
函数式风格的优势在于可以使用匿名函数快速定义临时策略,无需提前声明:
sorter.SetStrategy(func(data []int) {
for i, j := 0, len(data)-1; i
data[i], data[j] = data[j], data[i]
}
})
这适用于一次性或场景特定的逻辑,比如反转数组,无需额外命名函数。
优势与适用场景
这种函数式策略模式变体在Go中更轻量:
- 无需定义多个结构体和接口,代码更简洁
- 策略即函数,易于传递、组合和测试
- 适合算法逻辑简单、变化频繁的场景
- 可结合闭包捕获上下文状态,实现更灵活的行为
比如在配置化处理、事件处理器、校验规则等场景中非常实用。
基本上就这些。Go的函数式特性让策略模式变得更直接,去掉冗余结构,突出行为可替换的本质。不复杂但容易忽略。









