首頁 > 後端開發 > Golang > 變形金剛

變形金剛

DDD
發布: 2024-11-15 16:10:03
原創
695 人瀏覽過

Go Transformers

Go-實用程式

go-utils 是一個函式庫,旨在在 go 中提供有用的函式庫,以減少開發人員建置內容和增加
的工作量 生產力。

下面提到了一些功能。

工作執行器

這試圖解決的基本問題是您希望如何根據收到的請求執行多個任務。
考慮以下場景。

  • processA 處理一種場景並可能產生錯誤。
  • processB 處理第二種情況並可能產生錯誤。

如您所見,所有這些過程都可能會導致錯誤。本質上,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
}
登入後複製

您可以觀察到程式碼的可讀性和可執行性有多好。這樣的思考過程和框架可以提高程式碼的可讀性。

Go 例程愛好者

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)   
}
登入後複製

Import library to your project to build cool stuff.

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
)
登入後複製

Simple example

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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板