一尘不染

为什么 goroutine 中的 fmt.Println 不打印一行?

go

我有以下代码:

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 中不会打印任何内容。

有人可以解释为什么会这样吗?


阅读 204

收藏
2021-12-22

共1个答案

一尘不染

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

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

2021-12-22