Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Diskussion der Verwendung ausgewählter Anweisungen in Golang

Ausführliche Diskussion der Verwendung ausgewählter Anweisungen in Golang

PHPz
PHPzOriginal
2023-04-06 08:53:29793Durchsuche

In Golang ist die Select-Anweisung eine nützliche Kontrollstruktur, die es Ihnen ermöglicht, zwischen mehreren Kanälen zu wählen, um einen Wert abzurufen, der zum Lesen oder Schreiben bereit ist, ohne andere Vorgänge zu blockieren.

In diesem Artikel befassen wir uns mit der Verwendung ausgewählter Anweisungen in Golang, ihrer Syntax und ihrer Rolle in der Mehrkanalkommunikation.

Grundlagen der Select-Anweisung

In Golang verwenden wir Select-Anweisungen, um Daten aus mehreren Kanälen zu lesen. Diese Kanäle können beliebiger Art sein, z. B. Pipes, gepufferte Kanäle, ungepufferte Kanäle usw. Hier ist ein einfaches Auswahlbeispiel:

package main

import "fmt"

func main() {

    c1 := make(chan string)
    c2 := make(chan string)

    go func() {
        for {
            c1 <- "from 1"
            time.Sleep(time.Second * 2)
        }
    }()

    go func() {
        for {
            c2 <- "from 2"
            time.Sleep(time.Second * 3)
        }
    }()

    go func() {
        for {
            select {
            case msg1 := <-c1:
                fmt.Println("Message 1", msg1)
            case msg2 := <-c2:
                fmt.Println("Message 2", msg2)
            }
        }
    }()

    var input string
    fmt.Scanln(&input)
}

In diesem Beispiel haben wir zwei Kanäle c1 und c2 erstellt. Dann richten wir zwei Goroutinen ein, um alle 2 Sekunden bzw. alle 3 Sekunden Daten in den Kanal zu schreiben. Wir verwenden eine Select-Anweisung, um alle Kanäle abzuhören und alle von den Kanälen empfangenen Nachrichten auszudrucken.

Die Syntax der Select-Anweisung

Das Folgende ist die allgemeine Form der Select-Anweisung:

select {
case <-channel1:
    // do something with channel1
case <-channel2:
    // do something with channel2
default:
    // do something default
}

Die Select-Anweisung enthält mehrere Case-Anweisungen und eine Standardanweisung. Kanaloperationen sind in jeder case-Anweisung enthalten, und diese Kanäle können unterschiedliche Kanaltypen sein. Wenn die SELECT-Anweisung ausgeführt wird, wartet sie auf den Abschluss einer der Kanaloperationen. Wenn mehrere Kanaloperationen bereit sind, wählt select zufällig einen der Kanäle aus, dh wählt zufällig einen auszuführenden Kanal aus.

Wenn kein vorbereiteter Kanal oder keine Standardanweisung vorhanden ist, wird die Standardanweisung ausgeführt. Wenn keine Standardanweisung vorhanden ist, wird die SELECT-Anweisung blockiert.

Verwendungsszenarien der Select-Anweisung

Select-Anweisung ist sehr nützlich, wenn es um Mehrkanalkommunikation geht. Hier sind einige häufige Nutzungsszenarien:

Szenario 1: Stream-Verarbeitung

Wenn Sie Streaming-Daten verarbeiten, müssen Sie Select-Anweisungen verwenden, um Daten aus mehreren Kanälen zu lesen. Hier ist ein einfaches Beispiel:

package main

import "fmt"

func main() {

    even := make(chan int)
    odd := make(chan int)
    quit := make(chan int)

    go send(even, odd, quit)
    receive(even, odd, quit)
}

func send(even, odd, quit chan<- int) {
    for i := 0; i <= 10; i++ {
        if i%2 == 0 {
            even <- i
        } else {
            odd <- i
        }
    }
    quit <- 0
}

func receive(even, odd, quit <-chan int) {
    for {
        select {
        case v := <-even:
            fmt.Println("Even number: ", v)
        case v := <-odd:
            fmt.Println("Odd number: ", v)
        case <-quit:
            return
        }
    }
}

In diesem Beispiel erstellen wir drei Kanäle: gerader Kanal, ungerader Kanal und Ausgangskanal. In der Sendefunktion senden wir eine Reihe von Zahlen. In der Empfangsfunktion verwenden wir Select-Anweisungen, um Zahlen aus geraden und ungeraden Kanälen zu lesen und zu beenden, wenn der Ausgangskanal bereit ist.

Szenario 2: Timeout-Behandlung

In einigen Fällen, wenn der Vorgang lange dauert, müssen Sie der Select-Anweisung möglicherweise eine Timeout-Bedingung hinzufügen. Hier ist ein einfaches Beispiel:

package main

import (
    "fmt"
    "time"
)

func main() {

    c1 := make(chan string)

    go func() {
        time.Sleep(time.Second * 2)
        c1 <- "result 1"
    }()

    select {
    case result := <-c1:
        fmt.Println(result)
    case <-time.After(time.Second * 1):
        fmt.Println("timeout 1")
    }
}

In diesem Beispiel erstellen wir einen Kanal c1 und implementieren eine Operation mit einer Verzögerung von 2 Sekunden in einer Goroutine, um eine lang laufende Operation zu simulieren. Dann versuchen wir, das Ergebnis zu lesen, nachdem wir in der Select-Anweisung die erforderliche Zeit gewartet haben. Da die Zeitüberschreitung kürzer ist als die Operationszeit, kommt es bei der Leseoperation zu einer Zeitüberschreitung und es wird eine Zeitüberschreitungsmeldung anstelle des Werts im Kanal ausgegeben.

Hinweise zu Select-Anweisungen

Bei der Verwendung von Select-Anweisungen müssen Sie die folgenden Punkte beachten:

  1. Select-Anweisungen können nur für Kanaloperationen verwendet werden. Wenn Sie eine andere Operation ausführen müssen, können Sie die SELECT-Anweisung nicht verwenden.
  2. Die case-Anweisung in der select-Anweisung sollte eine nicht blockierende Operation sein. Wenn Ihre Case-Anweisung eine Blockierungsoperation enthält, wird sie nie ausgewählt.
  3. Wenn die case-Anweisung in der select-Anweisung nicht eindeutig ist (z. B. sind zwei Kanäle gleichzeitig bereit), wird ein Kanal zufällig ausgewählt.
  4. Wenn alle Fälle in der Auswahl nicht blockierende Vorgänge sind und keine Standardanweisung vorhanden ist, blockiert die Auswahlanweisung, bis mindestens ein Kanal bereit ist.

Fazit

In diesem Artikel haben wir ein detailliertes Verständnis der Verwendung, Syntax und Verwendungsszenarien der Select-Anweisung. Wir können die erforderlichen Daten aus mehreren Kanälen abrufen, was eine effizientere Kommunikation und Parallelitätskontrolle ermöglicht. Als Golang-Entwickler müssen Sie die Select-Anweisung beherrschen, damit Sie sie in der Praxis flexibel einsetzen können.

Das obige ist der detaillierte Inhalt vonAusführliche Diskussion der Verwendung ausgewählter Anweisungen in Golang. 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