1. ホーム
  2. go

ゴルーチン内のfmt.Printlnはなぜ行を表示しないのですか?

2023-09-22 02:42:34

質問

次のようなコードがあります。

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...

しかし、これをゴルーチン内に持っていても何も表示されません。

なぜそうなるのか、どなたか説明していただけませんか?

どのように解決するのですか?

を実行すると、プログラムが終了します。 main() 関数が終了した時点で終了します。 これは、ゴルーチンが実行され、その出力が印刷される前に起こる可能性が高いです。

一つの選択肢は、メインゴルーチンがチャネルからの読み込みをブロックし、ゴルーチンがその作業を完了したときにチャネルに書き込むようにすることです。