Macht ein Go-Kanal zurück zwei Werte?
Sah ich einige code in diesem link, und verwirrt:http://www.darkcoding.net/software/go-lang-after-four-months/
Was bedeutet der zweite Wert(ok)?
for self.isRunning {
select {
case serverData, ok = <-fromServer: //What's the meaning of the second value(ok)?
if ok {
self.onServer(serverData)
} else {
self.isRunning = false
}
case userInput, ok = <-fromUser:
if ok {
self.onUser(userInput)
} else {
self.isRunning = false
}
}
}
InformationsquelleAutor der Frage hardPass | 2012-05-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Boolesche variable
ok
zurückgegeben durch eine erhalten Betreiber zeigt an, ob der empfangene Wert gesendet wurde, auf den Kanal (true) oder ein null-Wert zurückgegeben, weil der Kanal ist geschlossen und leer ist (false).Den
for
Schleife wird beendet, wenn irgendein anderer Teil der Go-Programm geschlossen, diefromServer
oder diefromUser
Kanal. In diesem Fall wird eine der case-Anweisungen wird festgelegtok
zu wahren. Also, wenn der Benutzer die Verbindung beendet oder der remote-server die Verbindung schließt, wird das Programm beendet.http://play.golang.org/p/4fJDkgaa9O:
InformationsquelleAutor der Antwort
Ein paar Antworten haben, zitiert die Spezifikation auf der receive-operator, sondern zu verstehen, müssen Sie wahrscheinlich zu Lesen, die Spezifikation auf die schließen-Funktion als gut. Da werden Sie sich Fragen, warum diese Funktionen so sind, wie Sie sind, Lesen Sie, wie die für die Erklärung reicht über einen Kanal. Die for-Anweisung muss ein signal zum stoppen der iteration und
close
ist der Weg ein Absender kann sagen, "keine Daten mehr".Mit
close
undok = <-
ausgesetzt als Teil der Sprache, die Sie verwenden können, in anderen Fällen, wenn Sie wünschen, senden goroutine zu signalisieren "keine Daten mehr". Der Beispiel-code in der Frage ist eine interessante Anwendung dieser Funktionen. Es ist der Umgang mit einem "server" - Kanal und "user" - Kanal, und wenn ein "keine Daten mehr" signal kommt von entweder von Ihnen, bricht es aus der Schleife.InformationsquelleAutor der Antwort Sonia
Siehe den entsprechenden Abschnitt in der language spec:
http://golang.org/ref/spec#Receive_operator
InformationsquelleAutor der Antwort newacct
In Gehen, Funktionen & Kanäle kann wieder mehr als 1 Wert. Hier ok muss einen booleschen Variablen mit true (erfolgreich) und false (nicht erfolgreich) und serverData die eigentlichen Daten aus den empfangenen Kanal.
InformationsquelleAutor der Antwort Chaos