Überprüfen Sie mit Go, ob ein Kanal einen Read-to-Read-Wert hat
Wie kann ich überprüfen, ob ein Kanal einen Wert hat, der für mich zu Lesen?
Ich nicht wollen, zu sperren, wenn das Lesen eines Kanals. Ich möchte sehen, ob es einen Wert hat. Wenn es funktioniert, werde ich es Lesen. Wenn Sie nicht über eine (noch) nicht, ich werde etwas anderes tun, und schauen Sie es später erneut.
Dank!
InformationsquelleAutor der Frage gonewbgo | 2010-08-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
WARNUNG: Dies ist nicht mehr korrekt, siehe Antwort unten.
Von den docs:InformationsquelleAutor der Antwort nos
Nur nicht-blockierende operation, die ich kenne, zu Lesen von einem Kanal innerhalb eines wählen Sie block haben einen default-Fall :
Bitte versuchen die nicht-blockierende hier
Hinweis zu den vorherigen Antworten: erhalten die Betreiber selbst ist jetzt eine blockierende operation, wie es von Go-1.0.3 . Die Spezifikation geändert wurde. Bitte versuchen Sie, die Blockierung hier (deadlock)
InformationsquelleAutor der Antwort Deleplace
Wenn Sie dies tun, dann oft, es ist wahrscheinlich nicht ein tolles design und Sie könnten besser laichen anderen goroutine zu tun, was Arbeit, die Sie planen zu tun, wenn es nichts zu Lesen vom Kanal. Das synchrone/blockierende Natur Gehen die Kanäle machen code leichter zu Lesen und zu Grunde geht, während die Planer und Billig goroutines bedeutet, dass asynchrone Aufrufe sind unnötig, da warten goroutines nehmen sehr wenig Ressourcen.
InformationsquelleAutor der Antwort Jessta
Sie nicht, zumindest nicht für die synchrone (unbuffered) - Kanäle. Es gibt keine Möglichkeit zu sagen, wenn ein Wert ist zu warten, ohne zu Fragen, nehmen Sie den Wert aus dem Kanal.
Für gepufferte Kanäle, die Sie technisch nutzen können, die len-Funktion zu tun, was Sie beschreiben, aber Sie wirklich sollte nicht. Ihre Technik ist ungültig.
Der Grund ist, dass es stellt eine race-Bedingung. Channel ch, Ihr goroutine kann sehen, dass len(ch) > 0 und schließen, dass es einen Wert warten. Es kann nicht schließen, jedoch, dass es Lesen kann aus dem Kanal, ohne zu blockieren-eine goroutine kann leer durch den Kanal zwischen der Zeit, die Sie check-len und die Zeit, die Ihr empfangen-Vorgang läuft.
Für die Zwecke, die Sie beschrieben, verwenden, wählen Sie mit einem default-Fall als Ripounet zeigte.
InformationsquelleAutor der Antwort Sonia
Leider, die bisherigen Antworten sind falsch. Die Spezifikation klar sagt, dass Sie KÖNNEN die Kanäle auf diese Weise mit len () - Funktion, aber nur, wenn Sie angegeben wird die Kanal-Kapazität - die Länge des Puffers für einen Kanal, während Sie zu machen. Wenn Sie ausgelassen ein-Kanal-Kapazität und macht es - die channel-Operationen werden immer blockiert.
InformationsquelleAutor der Antwort Yaroslav Voytovych
In den meisten Fällen unter Berufung auf diese Informationen ist ein wirklich schlechtes design Wahl. Nicht einmal sagen, wie es ist schmutzig in seiner Umsetzung.
So, nicht implementieren Sie die folgenden Schritte zu erkennen, ob der Kanal ist bereit für Lesen zur Laufzeit:
InformationsquelleAutor der Antwort Artem Co