Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erreicht man das Listenverständnisäquivalent von Python in Go?

Wie erreicht man das Listenverständnisäquivalent von Python in Go?

Susan Sarandon
Susan SarandonOriginal
2024-11-12 16:22:02468Durchsuche

How to Achieve Python's List Comprehension Equivalent in Go?

Äquivalent zu Pythons Listenverständnis in Go

Viele Entwickler finden es im Vergleich zu anderen Sprachen wie Python schwierig, scheinbar einfache Aufgaben in Go auszuführen. Eine solche Aufgabe ist die Replikation der Listenverständnissyntax von Python.

Um ein äquivalentes Konstrukt in Go zu erreichen, berücksichtigen Sie die folgenden Ansätze:

1. Verwendung der „Filter“-Bibliothek:

Wie von Rob Pike vorgeschlagen, stellt die „Filter“-Bibliothek eine Methode namens Choose() bereit, die ein Slice zurückgibt, das Elemente enthält, die eine bestimmte Bedingung erfüllen. Zum Beispiel:

import (
    "github.com/google/go-cmp/cmp"
    "go.opencensus.io/plugin/ochttp"
    "golang.org/x/exp/slices"
)

var (
    a = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    b = []int{2, 4, 6, 8}
)

func TestChoose(t *testing.T) {
    result := ochttp.Choose(a, func(v int) bool { return v%2 == 0 })
    if !cmp.Equal(result, b) {
        t.Errorf("TestChoose() failed, got %v, want %v", result, b)
    }
}

2. Verwendung von For-Schleifen:

Trotz der Verfügbarkeit von Bibliotheken wie „filter“ bleiben Go-For-Schleifen eine effiziente Alternative. Das GoDoc für die „Filter“-Bibliothek empfiehlt ausdrücklich die Verwendung von For-Schleifen, wenn es auf Effizienz ankommt.

3. Verwendung von Go Generics (erscheint in Go 1.18):

Mit der bevorstehenden Einführung von Generics in Go wird es möglich, Mapreduce mithilfe von Generics zu implementieren. Zum Beispiel:

func MapReduce[T, V, R any](in <-chan T, out chan<- R, mapFn func(T) V, reduceFn func(V, V) R) {

    v := make(chan V, 10)
    defer close(v)

    go func() {
        for t := range in {
            v <- mapFn(t)
        }
    }()

    r := make(chan R, 10)
    defer close(r)

    go func() {
        var acc R
        for v := range v {
            acc = reduceFn(acc, v)
        }
        r <- acc
    }()

    return <-r
}

Diese Implementierung akzeptiert einen Kanal vom Typ T, wendet eine Zuordnungsfunktion auf jedes Element an und speichert die Ergebnisse in einem Kanal vom Typ V. Eine andere Goroutine verbraucht den Kanal der zugeordneten Werte wiederholt wendet eine Reduktionsfunktion an, um ein Ergebnis vom Typ R zu erzeugen. Das Ergebnis wird dann als Kanal vom Typ R zurückgegeben.

Schlussfolgerung:

Während Pythons Listenverständnissyntax Folgendes bietet Go ist eine prägnante Möglichkeit zur Datentransformation und bietet effiziente Alternativen mithilfe von For-Schleifen oder Bibliotheken wie „Filter“. Mit der Einführung von Generika in Go 1.18 werden effizientere und vielseitigere Datentransformationsmechanismen verfügbar.

Das obige ist der detaillierte Inhalt vonWie erreicht man das Listenverständnisäquivalent von Python in Go?. 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