Why does fmt.Println inside a goroutine not print a line?

后端 未结 4 933
野趣味
野趣味 2020-11-28 07:10

I have the following code:

package main

import \"net\"
import \"fmt\"
import \"bufio\"

func main() {
    conn, _ := net.Dial(\"tcp\", \"irc.freenode.net:66         


        
相关标签:
4条回答
  • 2020-11-28 07:23

    Your program will exit when the main() function finishes. This is likely to happen before your goroutine has time to run and print its output.

    One option would be to have the main goroutine block reading from a channel, and have the goroutine write to the channel when it has completed its work.

    0 讨论(0)
  • 2020-11-28 07:35

    You need to add a time delay like time.Sleep(3 * time.Second) (this waits 3 seconds).

    The goroutine closes when the program terminates. I had the exact same problem.

    0 讨论(0)
  • 2020-11-28 07:38

    Write data to a channel ch at the end of goroutine and read data from ch out of goroutine can make the main function waiting for goroutine print message.

    Here is an example:

    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
    }
    
    0 讨论(0)
  • 2020-11-28 07:39

    Another common way to "wait for a goroutines end", is using WaitGroup: http://golang.org/pkg/sync/#WaitGroup . You can use waitGroup.Add(1) for each started goroutine, then use waitGroup.Done() in each goroutine after it finishes. In the main function you can use waitGroup.Wait() and this will wait until waitGroup.Done() has been called for each added goroutine.

    0 讨论(0)
提交回复
热议问题