Nicht blockierende Kanaloperationen

GolangGolangBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Dieses Labor zielt darauf ab, Ihr Verständnis von nicht blockierenden Kanaloperationen in Golang zu testen. Sie werden verlangt, nicht blockierende Sends, Receives und mehrwege-Selekte mit der select-Anweisung mit einer default-Klausel zu implementieren.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/ConcurrencyGroup(["Concurrency"]) go/ConcurrencyGroup -.-> go/channels("Channels") subgraph Lab Skills go/channels -.-> lab-15491{{"Nicht blockierende Kanaloperationen"}} end

Nicht blockierende Kanaloperationen

Das Problem, das in diesem Labor gelöst werden soll, ist die Implementierung nicht blockierender Kanaloperationen mit der select-Anweisung mit einer default-Klausel.

  • Implementieren Sie einen nicht blockierenden Empfang über einen Kanal mit der select-Anweisung mit einer default-Klausel.
  • Implementieren Sie einen nicht blockierenden Sendevorgang über einen Kanal mit der select-Anweisung mit einer default-Klausel.
  • Implementieren Sie einen mehrwege nicht blockierenden select mit der select-Anweisung mit mehreren case-Klauseln und einer default-Klausel.
$ go run non-blocking-channel-operations.go
keine Nachricht empfangen
keine Nachricht gesendet
keine Aktivität

Hier ist der vollständige Code:

// Grundlegende Sende- und Empfangsoperationen über Kanäle sind blockierend.
// Wir können jedoch `select` mit einer `default`-Klausel verwenden, um
// _nicht blockierende_ Sende-, Empfangs- und sogar
// nicht blockierende mehrwege `select`s zu implementieren.

package main

import "fmt"

func main() {
	messages := make(chan string)
	signals := make(chan bool)

	// Hier ist ein nicht blockierender Empfang. Wenn ein Wert
	// auf `messages` verfügbar ist, wird `select` den `<-messages`-
	// `case` mit diesem Wert auswählen. Wenn nicht, wird es
	// sofort den `default`-Fall auswählen.
	select {
	case msg := <-messages:
		fmt.Println("empfangene Nachricht", msg)
	default:
		fmt.Println("keine Nachricht empfangen")
	}

	// Ein nicht blockierender Sendevorgang funktioniert ähnlich. Hier kann `msg`
	// nicht an den `messages`-Kanal gesendet werden, da der Kanal keinen Puffer hat
	// und es keinen Empfänger gibt. Daher wird der `default`-Fall ausgewählt.
	msg := "hi"
	select {
	case messages <- msg:
		fmt.Println("gesendete Nachricht", msg)
	default:
		fmt.Println("keine Nachricht gesendet")
	}

	// Wir können mehrere `case`s oberhalb der `default`-
	// Klausel verwenden, um einen mehrwege nicht blockierenden
	// `select` zu implementieren. Hier versuchen wir nicht blockierende
	// Empfänge sowohl auf `messages` als auch auf `signals`.
	select {
	case msg := <-messages:
		fmt.Println("empfangene Nachricht", msg)
	case sig := <-signals:
		fmt.Println("empfangenes Signal", sig)
	default:
		fmt.Println("keine Aktivität")
	}
}

Zusammenfassung

In diesem Labor haben Sie gelernt, wie Sie nicht blockierende Kanaloperationen mit der select-Anweisung mit einer default-Klausel implementieren. Sie haben einen nicht blockierenden Empfang, einen nicht blockierenden Sendevorgang und einen mehrwege nicht blockierenden select implementiert.