2017-11-13 5 views
0

Haben Sie einfach eine Frage, was hier passiert?Golang: für immer Kanal

forever := make(chan bool) 

log.Printf(" [*] Waiting for messages. To exit press CTRL+C") 
<-forever 
+0

eine delve Sitzung öffnen und zerlegen, oder einfach nur '[s, d] trace' die verarbeiten. Sie werden sehen, dass das, was icza in seiner Antwort sagt, genau das ist, was vor sich geht: '<-forever 'ist eine blockierende Operation. Ähnlich würde "forever <-true" auch blockieren (weil keine Routine aus dem Kanal liest) –

+2

Kanäle werden ausführlich in der exzellenten [Go-Tour] (https://tour.golang.org/welcome/1) behandelt. – Adrian

Antwort

9

Dieser Code erstellt einen ungepufferten Kanal und versucht, von ihm zu empfangen.

Und da niemand jemals etwas sendet, ist es im Wesentlichen eine blockierende Operation für immer.

Der Zweck davon ist, die goroutine vom Ende/Rückkehr zu halten, am wahrscheinlichsten, weil es andere goroutines gibt, die einige gleichzeitig arbeiten, oder sie auf bestimmte Ereignisse oder eingehende Nachrichten warten (wie Ihre Protokollnachricht sagt).

Und die brauchen für das ist, dass ohne diese Anwendung möglicherweise die Anwendung beendet wird, ohne auf andere goroutines warten. Wenn nämlich die main Goroutine endet, endet das Programm ebenfalls. Zitiert aus Spec: Program execution:

Die Programmausführung beginnt mit dem Hauptpaket zu initialisieren und dann die Funktion Haupt aufgerufen wird. Wenn dieser Funktionsaufruf zurückkehrt, wird das Programm beendet. Es wartet nicht darauf, dass andere (nicht main) Goroutines abgeschlossen werden.

Schauen Sie sich diese Antwort für ähnliche und weitere Techniken: Go project's main goroutine sleep forever?

Für eine Einführung über Kanäle finden What are golang channels used for?

Verwandte Themen