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()

注意事项

  1. 匹配是按顺序进行的,第一个匹配成功的case会被执行
  2. 如果没有匹配到任何case且没有提供Default,Run()会panic
  3. 对于RunWithReturn(),所有case的返回值类型必须一致
  4. 结构体匹配时,未指定的字段会被忽略

pattern-match库为Go语言带来了更强大的模式匹配能力,特别适合处理复杂的条件分支逻辑。它的API设计简洁,与Go语言的风格保持一致,是传统switch语句的有力补充。

回到顶部