3

golang.org の例を実行しようとしています: http://tour.golang.org/#63

  • Gosched が正確に何をするかをテストするために、コードを変更しました。

次のような出力が表示されます。 ここに画像の説明を入力

hello
hello
hello
hello
hello

しかし、これらのコードを私の Mac OS X 10.8 (Go バージョン 1.0.3) にコピーすると、出力が変わりました: ここに画像の説明を入力 xxxxxx$ go version go version go1.0.3 xxxxxx$ go run goroutine.go hello world hello world hello world hello world hello世界

この回答によると、runtime.GoSched を使用する必要がありますが、実際には必要ありません。

これで私を助けてください、どうもありがとう。

4

3 に答える 3

4

ここでの問題は、2 つの異なる実装があることです。

ローカルでは、fmt.Println が呼び出されるたびにコードがスケジューラに渡されます。Println は、syscall を行う stdout への書き込みを行います。すべてのシステムコールは、runtime.Gosched と同じ方法で生成されます。

play.golang.org はブラック ボックスです。それがどのように機能するかは実際にはわかりません。ただし、あなたが示した例から、 fmt.Println が呼び出されたときに、play が syscall を行わないように見えます。意味あり。彼らはおそらく os.Stdout をバッファに置き換えて、出力されたものを保持しました。

于 2012-11-07T03:24:30.077 に答える
2

Go Tourコードは、紹介例にすぎません。コードは単純で正しくありません。GoTour63は、次の出力を提供します(行番号が追加されました)。

1 hello
2 world
3 hello
4 world
5 hello
6 world
7 hello
8 world
9 hello

プログラムは10行を出力する必要があります。10 world行が欠落していることに注意してください。おそらくそれは意図的なものであり、ユーザーはこれに気づき、問題の原因を調査することが期待されます。言語仕様の「プログラムの実行」セクションには、次のように記載されています。

関数mainが戻ると、プログラムは終了します。他の(メインではない)ゴルーチンが完了するのを待ちません。

このステートメントは、プログラムが10行未満を印刷する理由を説明しています。

正しいGoプログラムは通常以下を使用します:

于 2012-11-10T20:44:51.180 に答える
0

これは、プログラミング環境の外で実行されるゴルーチンを呼び出しているためです。文字通り、2 つのスレッドが同時に実行され、出力がランダムになることは明らかです。

于 2016-09-19T08:36:04.533 に答える