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
qbhy0715@qq.com
发表回复