Heim >Backend-Entwicklung >Golang >Gehen Sie Transformers

Gehen Sie Transformers

DDD
DDDOriginal
2024-11-15 16:10:03695Durchsuche

Go Transformers

Go-Utils

go-utils ist eine Bibliothek, die darauf abzielt, nützliche Bibliotheken in Go bereitzustellen, um den Entwickleraufwand beim Erstellen von Dingen zu reduzieren und zu erhöhen
Produktivität.

Einige Funktionen werden unten erwähnt.

Task-Runner

Das Grundproblem, das hier gelöst werden soll, besteht darin, wie Sie mehrere Aufgaben basierend auf einer Anfrage ausführen möchten, die Sie erhalten haben.
Stellen Sie sich das folgende Szenario vor.

  • ProzessA verarbeitet ein Szenario und kann Fehler erzeugen.
  • ProzessB verarbeitet das zweite Szenario und kann einen Fehler erzeugen.

Wie Sie sehen, können alle diese Prozesse zu einem Fehler führen. Von Natur aus ist Golang bei der Fehlerbehandlung sehr ausführlich. Manchmal möchten wir diesen überflüssigen Code nicht sehen.
Auch dies verringert die Lesbarkeit.

Betrachten Sie nun ein anderes Szenario –
Sobald Sie den Fehler für ProzessA behandelt und ProzessB vergessen haben, wird Golang keinen Kompilierzeitfehler mehr auslösen, der dazu führt, dass Sie diesen Fall übersehen. Ein kleiner Fehler kann Chaos anrichten. Obwohl wir vor dem Versand an die Produktion viele Prozesse befolgen müssen, fragen Sie sich: Befolgen Sie diese immer oder nicht?

Um dieses Problem zu lösen, habe ich einen Ansatz entwickelt, bei dem Sie
dabei sein werden Ich konzentriere mich mehr darauf, zu schreiben, worauf es ankommt und wie einfach es wäre, einen Fn anzuschauen und zu verstehen, was er tut. Dies hilft auch bei der Überwindung von Variablenschatten. In Fällen, in denen mehrere Fehler zugeordnet werden, kann es zu einer Fehlerschattenbildung kommen, die schädlich sein kann. Das Befolgen dieses Musters und die richtige Codierung können dabei helfen, solche seltsamen Szenarien zu vermeiden.

Beispiele -

Ein Code mit redundanter Fehlerbehandlung und eingeschränkter Lesbarkeit.

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
}

Ein Code mit dem Task-Runner

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
}

Wie Sie sehen können, ist der Code besser lesbar und ausführbar. Dieser Denkprozess und dieses Framework können die Lesbarkeit des Codes verbessern.

Go-Routine-Enthusiasten

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
}

Stream-Utilities

Wir alle kennen die berühmten Lambdas- und Pfeilfunktionen. Golang
unterstützt die Pfeilsyntax grundsätzlich nicht. Es wäre schön, es zu haben
das in Golang. Nehmen wir zunächst an, wir müssen eine Kartenoperation ausführen, die
Hier wird es schwierig. Dann erwartet Sie eine coole Umsetzung
von mir, das für Sie zu lösen. Nach dieser unten aufgeführten Implementierung würde ich
Bitten Sie Sie, sich selbst eine Lösung zu überlegen, wie dies umgesetzt worden wäre.

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)

}

Das obige Beispiel gilt für eine Konvertierung eines Strings in float64.
Dadurch werden die Fehler für Sie behoben, falls vorhanden. Die einzige Ausnahme besteht darin, dass es gegebenenfalls zu Laufzeitfehlern kommen kann
Probleme mit der Typbesetzung Seien Sie also vorsichtig. Versuchen Sie, die Testfälle zu schreiben
wodurch dieses Problem vermieden werden sollte.

Tödliche Filter- und Mapper-Kombination

Eine Erweiterung der Funktionalität wurde jetzt vorgenommen, die Filterung funktioniert auch.
Viel Spaß, Leute!!

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
}

Importieren Sie eine Bibliothek in Ihr Projekt, um coole Sachen zu erstellen.

get -u github.com/mahadev-k/go-utils@v1.0.1

Fügen Sie dies zu Ihrem go.mod hinzu.
Verwenden Sie es wie im Beispielmodul.

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
}

Einfaches Beispiel

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
}

Schauen Sie sich das Repo an:
Github: https://github.com/mahadev-k/go-utils

Wenn man bedenkt, dass Sie dies gelesen haben und es Ihnen gefallen hat. Wenn Sie mit mir in Kontakt treten möchten
Folge mir auf X – https://x.com/mahadev_k_
Linkedin – https://in.linkedin.com/in/mahadev-k-934520223
Schlagen Sie bei Interesse weitere Ideen für Beiträge zu diesem Repo vor.
Danke ??

Das obige ist der detaillierte Inhalt vonGehen Sie Transformers. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn