go-utils 是一個函式庫,旨在在 go 中提供有用的函式庫,以減少開發人員建置內容和增加
的工作量
生產力。
下面提到了一些功能。
這試圖解決的基本問題是您希望如何根據收到的請求執行多個任務。
考慮以下場景。
如您所見,所有這些過程都可能會導致錯誤。本質上,Golang 在錯誤處理方面非常冗長。有時我們不想看到那些多餘的程式碼。
這也會降低可讀性。
現在考慮另一種情況 -
一旦你處理了 processA 的錯誤而忘記了 processB,Golang 就不會拋出編譯時錯誤,導致你錯過這種情況。一個小小的失誤就會造成嚴重破壞。儘管我們在發貨之前應該遵循很多流程,但問問自己,你是否始終遵循?
為了解決這個問題,我開發了一種方法,您將
更專注於寫出重要的內容以及查看 fn 並理解它的作用是否容易。這也將有助於克服變數陰影。可能會出現多個錯誤被分配錯誤陰影的情況,這可能很糟糕。遵循這種模式和正確的編碼可以幫助避免這種奇怪的情況。
範例 -
func FooBar() error { req := struct{ isFoo bool isBar bool }{} ctx := context.TODO() err := processFoo(ctx, &req) if err != nil { return err } err = processBar(ctx, &req) if err != nil { return err } return nil }
func FooBar() error { req := struct{ isFoo bool isBar bool }{} ctx := context.TODO() runner := NewSimpleTaskRunner(ctx, req) _, err := runner. Then(processFoo). Then(processBar). Result() return err }
您可以觀察到程式碼的可讀性和可執行性有多好。這樣的思考過程和框架可以提高程式碼的可讀性。
func FooBar() error { req := struct{ isFoo bool isBar bool }{} ctx := context.TODO() runner := NewSimpleTaskRunner(ctx, req) _, err := runner. Parallel(processFooParallel). Parallel(processBarParallel). Result() return err }
我們都知道著名的 lambda 和箭頭函數。 Golang
本質上不支援箭頭語法。如果有的話就太好了
在 golang 中。現在假設我們需要執行一些 Map 操作
事情變得艱難了。好吧,您即將迎來一個很酷的實施
由我來為您解決這個問題。在下面的實作之後我會
請你自己想一個解決方案,如何實現這一點。
func TestMapRunner(t *testing.T) { // Create a map with some values floatingStrings := []string{"0.1", "0.2", "22", "22.1"} res, err := NewTransformer[string, float64](floatingStrings). Map(MapIt[string, float64](func(item string) (float64, error) { return strconv.ParseFloat(item, 64) })). Map(MapIt[float64, float64](func(item float64) (float64, error) { return item * 10, nil })). Result() if err != nil { t.Errorf("Testcase failed with error : %v", err) return } // Output: [0.1 0.2 22 22.1] t.Logf("Result: %v", res) assert.ElementsMatch(t, []any{float64(1), float64(2), float64(220), float64(221)}, res) }
上面的範例是將字串轉換為 float64。
如果有任何錯誤,這將為您處理。唯一的例外是,如果有任何
,可能會出現運行時錯誤
類型轉換問題所以要小心這一點。嘗試編寫測試案例
這應該可以避免這個問題。
現在新增了功能,過濾也可以使用。
祝大家有個愉快的時光! !
func TestFilterIt(t *testing.T) { // Create a map with some values floatingStrings := []string{"0.1", "0.2", "22", "22.1"} res, err := NewTransformer[string, int64](floatingStrings). Map(MapIt[string, float64](func(item string) (float64, error) {return strconv.ParseFloat(item, 64)})). Map(MapIt[float64, float64](func(item float64) (float64, error) { return item * 10, nil })). Map(MapIt[float64, int64](func(item float64) (int64, error) { return int64(item), nil })). Map(FilterIt[int64](func(item int64) (bool, error) { return item%2 == 0, nil })). Result() if err != nil { t.Errorf("Testcase failed with error : %v", err) return } // Output: [2 220] t.Logf("Result: %v", res) assert.ElementsMatch(t, []any{int64(2), int64(220)}, res) }
go get -u github.com/mahadev-k/go-utils@v1.0.1
Add this to your go.mod.
Use it as done in the examples module.
module examples go 1.23.2 require github.com/stretchr/testify v1.9.0 require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/mahadev-k/go-utils v1.0.1 // indirect *go-utils* github.com/pmezard/go-difflib v1.0.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect )
func TestMapRunnerLib(t *testing.T) { // Create a map with some values floatingStrings := []string{"0.1", "0.2", "22", "22.1"} res, err := streams.NewTransformer[string, int64](floatingStrings). Map(streams.MapIt[string, float64](func(item string) (float64, error) { return strconv.ParseFloat(item, 64) })). Map(streams.MapIt[float64, float64](func(item float64) (float64, error) { return item * 10, nil })). Map(streams.MapIt[float64, int64](func(item float64) (int64, error) { return int64(item), nil })). Map(streams.FilterIt[int64](func(item int64) (bool, error) { return item%2 == 0, nil })). Result() if err != nil { t.Errorf("Testcase failed with error : %v", err) return } // Output: [2 220] t.Logf("Result: %v", res) assert.ElementsMatch(t, []any{int64(2), int64(220)}, res) }
Checkout the repo:
Github: https://github.com/mahadev-k/go-utils
Considering you had read this through and liked it. If you would like to connect with me
Follow me on X - https://x.com/mahadev_k_
Linkedin - https://in.linkedin.com/in/mahadev-k-934520223
Do propose more ideas for contributions to this repo if interested.
Thank you ??
以上是變形金剛的詳細內容。更多資訊請關注PHP中文網其他相關文章!