Ich habe folgenden Code:
package main
import "net"
import "fmt"
import "bufio"
func main() {
conn, _ := net.Dial("tcp", "irc.freenode.net:6667")
reader := bufio.NewReader(conn)
go func() {
str, err := reader.ReadString('\n')
if err != nil {
// handle it
fmt.Println(err)
}
fmt.Println(str)
}()
}
Wenn ich nicht den Code habe, der in einer Goroutine aus dem Puffer liest, gibt er eine Nachricht wie diese aus, was ich erwarte:
:zelazny.freenode.net NOTICE * :*** Looking up your hostname...
Wenn Sie es jedoch in einer Goroutine haben, wird nichts gedruckt.
Kann jemand erklären, warum das so ist?
Eine andere übliche Methode, um "auf das Ende der Goroutinen zu warten", ist die Verwendung von
WaitGroup
: http://golang.org/pkg/sync/#WaitGroup . Sie könnenwaitGroup.Add(1)
für jede gestartete Goroutine verwenden und dannwaitGroup.Done()
in jeder Goroutine verwenden, nachdem sie beendet ist. In der Hauptfunktion können Sie verwendenwaitGroup.Wait()
und dies wird warten, biswaitGroup.Done()
für jede hinzugefügte Goroutine aufgerufen wurde.quelle
Schreiben Sie Daten in einen Kanal
ch
am Ende der Goroutine und lesen Sie Daten vonch
außerhalb der Goroutine. Dadurch kann die Hauptfunktion auf die Goroutine-Drucknachricht warten.Hier ist ein Beispiel:
package main import "net" import "fmt" import "bufio" func main() { conn, _ := net.Dial("tcp", "irc.freenode.net:6667") reader := bufio.NewReader(conn) ch := make(chan byte, 1) go func() { str, err := reader.ReadString('\n') if err != nil { // handle it fmt.Println(err) } fmt.Println(str) ch <- 1 }() <-ch }
quelle
Sie müssen eine Zeitverzögerung wie hinzufügen
time.Sleep(3 * time.Second)
(dies wartet 3 Sekunden).Die Goroutine wird geschlossen, wenn das Programm beendet wird. Ich hatte genau das gleiche Problem.
quelle