我有以下代码:
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里面什么都不打印。
有人可以解释为什么会这样吗?
当main()
函数完成时,您的程序将退出。这可能发生在你的goroutine有时间运行并打印输出之前。
一种选择是让主goroutine块从通道读取,并在完成其工作时将goroutine写入通道。
另一种“等待goroutines结束”的常用方法是使用WaitGroup
:http://golang.org/pkg/sync/#WaitGroup。你可以为每个开始的goroutine使用waitGroup.Add(1)
,然后在每个goroutine完成后使用waitGroup.Done()
。在main函数中你可以使用waitGroup.Wait()
,这将等到为每个添加的goroutine调用waitGroup.Done()
。
在goroutine结束时将数据写入通道ch
并从goroutine中读取ch
中的数据可以使主函数等待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关闭。我有同样的问题。