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

Rya*_*igg 68 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)
    }()

}
Run Code Online (Sandbox Code Playgroud)

如果我没有从goroutine中的缓冲区读取的代码,它会输出这样的消息,这是我期望发生的:

:zelazny.freenode.net NOTICE * :*** Looking up your hostname...
Run Code Online (Sandbox Code Playgroud)

然而,将它放在goroutine里面什么都不打印.

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

Jam*_*dge 76

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

一种选择是让主goroutine块从通道读取,并在完成其工作时将goroutine写入通道.

  • 感谢James的精彩解释.我绝对认为渠道是我正在寻找的. (2认同)

小智 35

另一种"等待goroutines结束"的常用方法是使用WaitGroup:http: //golang.org/pkg/sync/#WaitGroup.你可以使用waitGroup.Add(1)每个开始的goroutine,然后waitGroup.Done()在每个goroutine完成后使用.在你可以使用的主要功能中waitGroup.Wait(),这将等到waitGroup.Done()每个添加的goroutine被调用.


rob*_*thy 5

ch在goroutine末尾向通道写入数据以及从chgoroutine外部读取数据可以使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
}
Run Code Online (Sandbox Code Playgroud)