fp-go - 专为 Go 语言设计的函数式编程库
大家好,又见面了,我是 GitHub 精选君!
背景介绍
在编程领域中,函数式编程是一种编程范式,它将计算视为函数的评估,避免改变状态和可变数据。然而,Go 语言并没有内建对函数式编程的支持,这使得在 Go 语言中实现函数式编程变得困难。
今天要给大家推荐一个 GitHub 开源项目 IBM/fp-go,该项目在 GitHub 有超过 1.1k Star,用一句话介绍该项目就是:“functional programming library for golang”。给 Go 语言插上翅膀。
项目介绍
fp-go 是一个功能强大的函数式编程库,专为 Go 语言设计。它的设计目标是提供一套数据类型和函数,使得在 Go 语言中编写可维护和可测试的代码变得简单而有趣。它鼓励以下编程开发模式:
1、编写许多小型、可测试和纯函数;
2、提供帮助器以将副作用隔离到延迟执行的函数(IO)中;
3、公开一致的组合集,以从现有函数创建新函数。
此外,每个数据类型都有一小组组合函数,这些函数在所有数据类型中的名称相同,因此你只需要学习少量的函数名称,同名函数的语义在所有数据类型中都是一致的。
如何使用
首先,你需要使用 “go get github.com/IBM/fp-go” 命令来获取这个库。然后,你可以参考提供的样本来开始使用。这个库强烈推崇使用小型、纯粹的函数,这些函数只根据它们的输入产生输出,不执行任何副作用。同时,它提供了一些帮助器,可以将副作用隔离到延迟执行的函数(IO)中。
以下是一个简单的示例,并行发起多个 HTTP 请求。
package http
import (
"context"
"fmt"
"testing"
HTTP "net/http"
A "github.com/IBM/fp-go/array"
R "github.com/IBM/fp-go/context/readerioeither"
H "github.com/IBM/fp-go/context/readerioeither/http"
E "github.com/IBM/fp-go/either"
F "github.com/IBM/fp-go/function"
IO "github.com/IBM/fp-go/io"
"github.com/stretchr/testify/assert"
)
type PostItem struct {
UserId uint `json:"userId"`
Id uint `json:"id"`
Title string `json:"title"`
Body string `json:"body"`
}
func idxToUrl(idx int) string {
return fmt.Sprintf("https://jsonplaceholder.typicode.com/posts/%d", idx+1)
}
// TestMultipleHttpRequests shows how to execute multiple HTTP requests in parallel assuming
// that the response structure of all requests is identical, which is why we can use [R.TraverseArray]
func TestMultipleHttpRequests(t *testing.T) {
// prepare the http client
client := H.MakeClient(HTTP.DefaultClient)
// readSinglePost sends a GET request and parses the response as [PostItem]
readSinglePost := H.ReadJson[PostItem](client)
// total number of http requests
count := 10
data := F.Pipe3(
A.MakeBy(count, idxToUrl),
R.TraverseArray(F.Flow3(
H.MakeGetRequest,
readSinglePost,
R.ChainFirstIOK(IO.Logf[PostItem]("Log Single: %v")),
)),
R.ChainFirstIOK(IO.Logf[[]PostItem]("Log Result: %v")),
R.Map(A.Size[PostItem]),
)
result := data(context.Background())
assert.Equal(t, E.Of[error](count), result())
}
项目推介
fp-go 是 IBM 公司开发的一款开源项目,尽管它还在开发中,但已经达到了 1.0 的主要版本。它受到了强大的 fp-ts 的影响,是一个非常有潜力的项目。此外,它遵循了 Go 语言的设计哲学,每个包都有一个单一的目的,明确处理错误,避免包级状态,简单性至上等。如果你在寻找一个能够帮助你在 Go 语言中实现函数式编程的库,那么 fp-go 绝对值得你一试。
以下是该项目 Star 趋势图(代表项目的活跃程度):
更多项目详情请查看如下链接。
开源项目地址:https://github.com/IBM/fp-go
开源项目作者:IBM
以下是参与项目建设的所有成员:
关注我们,一起探索有意思的开源项目。
更多精彩请扫码关注如下公众号。