專爲 Go 語言設計的函數式編程庫 fp-go
背景介紹
在編程領域中,函數式編程是一種編程範式,它將計算視爲函數的評估,避免改變狀態和可變數據。然而,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
以下是參與項目建設的所有成員:
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/rcNdgtU5Es7VJiuDQjA2YA