Alle Beispiele, die ich bisher gesehen habe, beinhalten das Blockieren des Ergebnisses (über den Operator <-chan
).
Mein aktueller Ansatz beinhaltet die Übergabe eines Zeigers an eine Struktur:
%Vor% welches die Goroutine nach Beendigung schreibt. Dann ist es eine einfache Sache, finished
zu überprüfen, wann immer es praktisch ist. Hast du bessere Alternativen?
Was ich wirklich anstrebe, ist ein Signal-Slot-System im Qt-Stil. Ich habe eine Ahnung, die Lösung wird fast trivial aussehen ( chan
s haben viele unerforschten Potenzial), aber ich bin noch nicht vertraut genug mit der Sprache, um es herauszufinden.
Sie können das "comma, ok" -Muster verwenden (siehe Seite effective go "):
%Vor%Select-Anweisungen ermöglicht es Ihnen, mehrere Kanäle gleichzeitig zu prüfen und eine zufällige Verzweigung (von denen, in denen die Kommunikation stattfindet) vorzunehmen wartet):
%Vor%Für alle senden und empfangen Ausdrücke in der "Select" -Anweisung, die Kanalausdrücke werden ausgewertet, zusammen mit allen möglichen Ausdrücken auf der rechten Seite von senden Ausdrücke in der Reihenfolge von oben nach unten. Wenn einer der resultierenden Vorgänge kann fortfahren, man ist auserwählt und der entsprechende Kommunikation und Aussagen werden ausgewertet. Andernfalls, Wenn es einen Standardfall gibt, dann führt aus; Wenn nicht, blockt die Anweisung bis einer der Kommunikationen kann vervollständigen.
Sie können auch einen Blick auf den Channel-Puffer werfen, um zu sehen, ob er irgendetwas enthält, indem Sie len verwenden:
%Vor% Dies wird den Kanalpuffer nicht berühren, im Gegensatz zu foo, gotValue := <- ch
, das einen Wert löscht, wenn gotValue == true
.
Tags und Links go goroutine signals-slots