首页 > V2EX > V2EX-🔥 🔥 🔥 新鲜出炉! go 版本的 pipeline 发布啦,你还在愁 go 没有好用的中间件吗?
2022
01-29

V2EX-🔥 🔥 🔥 新鲜出炉! go 版本的 pipeline 发布啦,你还在愁 go 没有好用的中间件吗?

qbhy:

Goal-web/pipeline

goal-web/pipeline
这是一个管道库,实现了 和 laravel 一样的管道功能,如果你很熟悉 laravel 的管道或者中间件,那你一定对这个库很有亲切感。

安装 – install

go get github.com/goal-web/pipeline

使用 – usage

得益于 goal 强大的容器,你可以在管道(pipe)和目的地(destination)任意注入容器中存在的实例

对管道不熟悉的同学,可以把 pipe 理解为中间件,destination 就是控制器方法

package tests

import (
"fmt"
"github.com/goal-web/container"
"github.com/goal-web/contracts"
"github.com/goal-web/pipeline"
"github.com/pkg/errors"
"testing"
)

type User struct {
Id   int
Name string
}

func TestPipeline(t *testing.T) {
pipe := pipeline.New(container.New())
pipe.Send(User{Id: 1, Name: "goal"}).
Through(
func(user User, next pipeline.Pipe) interface{} {
fmt.Println("中间件 1-start")
result := next(user)
fmt.Println("中间件 1-end")
return result
},
func(user User, next pipeline.Pipe) interface{} {
fmt.Println("中间件 2-start")
result := next(user)
fmt.Println("中间件 2-end")
return result
},
).
Then(func(user User) {
fmt.Println("then", user)
})
}

// TestPipelineException 测试异常情况
func TestPipelineException(t *testing.T) {
defer func() {
recover()
}()
pipe := pipeline.New(container.New())
pipe.Send(User{Id: 1, Name: "goal"}).
Through(
func(user User, next pipeline.Pipe) interface{} {
fmt.Println("中间件 1-start")
result := next(user)
fmt.Println("中间件 1-end", result)
return result
},
func(user User, next pipeline.Pipe) interface{} {
fmt.Println("中间件 2-start")
result := next(user)
fmt.Println("中间件 2-end", result)
return result
},
).
Then(func(user User) {
panic(errors.New("报个错"))
})
}

// TestStaticPipeline 测试调用 magical 函数
func TestStaticPipeline(t *testing.T) {
// 应用启动时就准备好的中间件和控制器函数,在大量并发时用 StaticPipeline 可以提高性能
middlewares := []contracts.MagicalFunc{
container.NewMagicalFunc(func(user User, next pipeline.Pipe) interface{} {
fmt.Println("中间件 1-start")
result := next(user)
fmt.Println("中间件 1-end", result)
return result
}),
container.NewMagicalFunc(func(user User, next pipeline.Pipe) interface{} {
fmt.Println("中间件 2-start")
result := next(user)
fmt.Println("中间件 2-end", result)
return result
}),
}
controller := container.NewMagicalFunc(func(user User) int {
fmt.Println("then", user)
return user.Id
})

pipe := pipeline.Static(container.New())
result := pipe.SendStatic(User{Id: 1, Name: "goal"}).
ThroughStatic(middlewares...).
ThenStatic(controller)

fmt.Println("穿梭结果", result)
/**
中间件 1-start
中间件 2-start
then {1 goal}
中间件 2-end [1]
中间件 1-end [1]
穿梭结果 [1]
 */
}

在 goal 之外的框架使用 – use in frameworks other than goal

这个库并不会限制你在哪个框架使用它,所以你可以在任意 go 环境使用这个管道库

goal-web
goal-web/pipeline
[email protected]

from V2EX-最新主题 https://bit.ly/3HfjCcM
V2EX-🔥 🔥 🔥 新鲜出炉! go 版本的 pipeline 发布啦,你还在愁 go 没有好用的中间件吗? - 第1张  | 牛C网(NiuL.Net)
牛C网:https://j1o.net
牛C网导航:https://niuc.icu
零九导航:https://09.gay

最后编辑:
作者:分享菌
这个作者貌似有点懒,什么都没有留下。

留下一个回复