77

我有以下代码:

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

4 回答 4

88

main()当函数完成时,您的程序将退出。这很可能在您的 goroutine 有时间运行并打印其输出之前发生。

一种选择是让主 goroutine 块从通道读取,并在完成工作后让 goroutine 写入通道。

于 2013-04-26T05:27:55.917 回答
40

“等待 goroutines 结束”的另一种常见方法是使用WaitGroup: http: //golang.org/pkg/sync/#WaitGroup。您可以waitGroup.Add(1)为每个启动的 goroutine 使用,然后waitGroup.Done()在每个 goroutine 完成后使用它。在你可以使用的主函数中waitGroup.Wait(),这将等到waitGroup.Done()为每个添加的 goroutine 调用。

于 2013-05-02T14:00:23.413 回答
4

ch在 goroutine 结束时将数据写入通道并从 goroutine 中读取数据ch可以使 main 函数等待 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
}
于 2017-08-29T07:24:55.547 回答
-12

您需要添加一个时间延迟time.Sleep(3 * time.Second)(这会等待 3 秒)。

goroutine 在程序终止时关闭。我有同样的问题。

于 2016-07-01T14:11:58.787 回答