golang模式匹配库插件pattern-match的使用
Golang模式匹配库插件pattern-match的使用
简介
这是一个Go语言的模式匹配库实现,灵感来源于Python的pampy库。目前支持以下匹配模式:
- 简单类型(如int、int64、float、float64、bool等)
- 结构体类型
- 切片(支持HEAD、TAIL、OneOf模式)
- 字典(支持ANY、OneOf模式)
- 正则表达式
- 自定义匹配(可为特定结构体添加特殊匹配逻辑)
安装
使用以下命令安装:
go get github.com/alexpantyukhin/go-pattern-match
使用示例
斐波那契数列示例
func fib(n int) int {
_, res := match.Match(n).
When(1, 1).
When(2, 1).
When(match.ANY, func() int { return fib(n-1) + fib(n-2) }).
Result()
return res.(int)
}
简单类型匹配
isMatched, mr := match.Match(42).
When(42, 10).
Result()
// isMatched - true, mr - 10
结构体匹配
简单类型检查
val := TestStruct{1}
isMatched, _ := Match(val).
When(func(TestStruct) {}, 1).
Result()
带条件的类型检查
val := TestStruct{1}
isMatched, _ := Match(val).
When(func(ts TestStruct) bool { return ts.value == 42 }, 1).
When(func(ts AnotherStruct) bool { return ts.stringValue == "hello" }, 2).
Result()
字典匹配
isMatched, mr := match.Match(map[string]int{
"rsc": 3711,
"r": 2138,
"gri": 1908,
"adg": 912,
}).
When(map[string]interface{}{
"rsc": 3711,
"r": 2138,
"gri": 1908,
"adg": match.ANY,
}, true).
Result()
切片匹配
isMatched, mr := match.Match([]int{1, 2, 3, 4, 5, 6}).
When([]interface{}{match.HEAD, 3, match.OneOf(3, 4), 5, 6}, 125).
Result()
正则表达式匹配
isMatched, mr := match.Match("gophergopher").
When("gophergopher", func() interface{} { return true }).
Result()
无返回值匹配
func main() {
Match(val).
When(42, func() { fmt.Println("You found the answer to life, universe and everything!") }).
When(ANY, func() { fmt.Println("No.. It's not an answer.") }).
Result()
}
完整示例
package main
import (
"fmt"
"github.com/alexpantyukhin/go-pattern-match"
)
func main() {
isMatched, mr := match.Match([]int{1, 2, 3}).
When(42, false).
When([]interface{}{match.HEAD, 2, 3}, true).
Result()
if isMatched {
fmt.Println(mr)
}
}
这个库提供了灵活的模式匹配功能,可以帮助简化复杂的条件判断逻辑。通过链式调用的方式,代码可读性也得到了提升。
更多关于golang模式匹配库插件pattern-match的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang模式匹配库插件pattern-match的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang模式匹配库pattern-match使用指南
pattern-match是一个Go语言实现的模式匹配库,它提供了类似函数式编程语言中的模式匹配功能。下面我将详细介绍它的使用方法。
安装
go get github.com/golang-infrastructure/go-pattern-match
基本使用
1. 简单匹配
import (
"fmt"
"github.com/golang-infrastructure/go-pattern-match"
)
func main() {
value := 42
match.NewMatcher(value).
Case(42, func() {
fmt.Println("匹配到42")
}).
Case(43, func() {
fmt.Println("匹配到43")
}).
Default(func() {
fmt.Println("默认情况")
}).
Run()
}
2. 带返回值的匹配
result := match.NewMatcher(value).
Case(42, func() int {
return 1
}).
Case(43, func() int {
return 2
}).
Default(func() int {
return 0
}).
RunWithReturn()
fmt.Println(result) // 输出1
3. 类型匹配
func checkType(v interface{}) {
match.NewMatcher(v).
Case(match.Type[int](), func() {
fmt.Println("是int类型")
}).
Case(match.Type[string](), func() {
fmt.Println("是string类型")
}).
Default(func() {
fmt.Println("未知类型")
}).
Run()
}
checkType(123) // 输出"是int类型"
checkType("abc") // 输出"是string类型"
checkType(3.14) // 输出"未知类型"
4. 自定义匹配器
// 定义偶数匹配器
func isEven(v int) bool {
return v%2 == 0
}
func main() {
value := 4
match.NewMatcher(value).
Case(match.Match(isEven), func() {
fmt.Println("是偶数")
}).
Default(func() {
fmt.Println("不是偶数")
}).
Run()
}
5. 结构体匹配
type Person struct {
Name string
Age int
}
func main() {
p := Person{"Alice", 30}
match.NewMatcher(p).
Case(Person{Name: "Alice", Age: 30}, func() {
fmt.Println("这是Alice, 30岁")
}).
Case(Person{Name: "Bob"}, func() {
fmt.Println("这是Bob")
}).
Default(func() {
fmt.Println("不认识的人")
}).
Run()
}
高级功能
1. 多条件匹配
value := 15
match.NewMatcher(value).
Case(match.All(
match.Type[int](),
match.Match(func(v int) bool { return v > 10 }),
match.Match(func(v int) bool { return v < 20 }),
), func() {
fmt.Println("是10到20之间的整数")
}).
Default(func() {
fmt.Println("不满足条件")
}).
Run()
2. 解构匹配
type Point struct {
X, Y int
}
func main() {
p := Point{3, 4}
match.NewMatcher(p).
Case(Point{X: 3, Y: match.Any()}, func(y int) {
fmt.Printf("X是3,Y是%d\n", y)
}).
Default(func() {
fmt.Println("其他情况")
}).
Run()
}
3. 模式组合
value := []interface{}{1, "hello", true}
match.NewMatcher(value).
Case([]interface{}{1, match.Any(), true}, func(s string) {
fmt.Printf("匹配到模式: 第二个元素是 %s\n", s)
}).
Default(func() {
fmt.Println("不匹配")
}).
Run()
注意事项
- 匹配是按顺序进行的,第一个匹配成功的case会被执行
- 如果没有匹配到任何case且没有提供Default,Run()会panic
- 对于RunWithReturn(),所有case的返回值类型必须一致
- 结构体匹配时,未指定的字段会被忽略
pattern-match库为Go语言带来了更强大的模式匹配能力,特别适合处理复杂的条件分支逻辑。它的API设计简洁,与Go语言的风格保持一致,是传统switch语句的有力补充。