关于golang:🔥-🔥-🔥-新鲜出炉go-版本的-pipeline-发布啦你还在愁-go-没有好用的中间件吗

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

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年50元

阿里云限时活动-2核2G-5M带宽-60G SSD-1000G月流量 ,特惠价99元/年(原价1234.2元/年,可以直接买3年),速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据