Почему дрм.Println внутри goroutine не печатает строку?
у меня есть следующий код:
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)
}()
}
Если у меня нет кода, который читает из буфера в goroutine, он выводит сообщение, подобное этому, что я и ожидаю:
:zelazny.freenode.net NOTICE * :*** Looking up your hostname...
однако, имея его внутри goroutine ничего не печатает.
может кто-нибудь объяснить, почему это так?
4 ответов:
ваша программа выйдет, когда
main()завершает функцию. Это, вероятно, произойдет до того, как ваш goroutine успеет запустить и распечатать свой вывод.одним из вариантов было бы чтение основного блока goroutine из канала и запись goroutine в канал, когда он завершит свою работу.
еще один распространенный способ "дождаться конца goroutines", использует
WaitGroup: http://golang.org/pkg/sync/#WaitGroup . Вы можете использоватьwaitGroup.Add(1)для каждого запущенного goroutine, затем используйтеwaitGroup.Done()в каждом goroutine после его завершения. В основной функции вы можете использоватьwaitGroup.Wait()и это будет ждать, покаwaitGroup.Done()был вызван для каждого добавленного goroutine.
запись данных в канал
chв конце goroutine и читать данные изchиз goroutine может сделать основную функцию, ожидающую сообщения печати goroutine.вот пример:
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 }
вам нужно добавить задержку времени как
time.Sleep(3 * time.Second)(это ждет 3 секунды).goroutine закрывается, когда программа завершается. У меня была точно такая же проблема.
Comments