2012-11-07 41 views
3

我試圖從golang.org執行一個例子:http://tour.golang.org/#63同Golang代碼不同的輸出,爲什麼?

  • 我已經改變了代碼來測試究竟Gosched做什麼*

你可以看到輸出有: enter image description here

hello 
hello 
hello 
hello 
hello 

但是,當我的代碼複製到我的Mac OS X 10.8(轉到版本1.0.3),輸出已經改變: enter image description here XXXXXX $旅途版本 去版本go1.0.3 XXXXXX $去運行,goroutine.go 你好 世界 你好 世界 你好 世界 你好 世界 你好 世界

根據這一answer,我應該使用runtime.GoSched,但實際上我不需要。所以我相信出了什麼問題。

請幫助我,非常感謝。

+1

我去了http://tour.golang.org/#63,輸出是hello \ nworld \ n,按照預期重複5次。您的本地運行示例用大寫字母打印「World」,表示您未複製並粘貼示例代碼。我假設你在某個地方有錯誤。請記住重置幻燈片,以便獲得原始示例代碼。 –

+0

謝謝@StephenWeinberg,我確定那些代碼是相同的(我已經改變了輸出文字進行測試,但現在我改變了它們)。 – MrROY

回答

4

這裏的問題是你有兩個不同的實現。

在本地,每次調用fmt.Println時,您的代碼都會生成調度程序。 Println執行一個系統調用的stdout。所有的系統調用都會產生與運行時相同的方式。

play.golang.org是一個黑匣子。我們實際上並不知道它是如何工作的。然而,從你給出的例子來看,當fmt.Println被調用時,似乎play不會執行系統調用。這是有道理的。他們可能用一個緩衝區取代os.Stdout來保存打印內容。

+0

你的意思是*所有的系統調用產生相同的方式runtime.Gosched做*?你確定嗎?如果它是真的,那麼我們何時應該使用runtime.Gosched?謝謝:D – MrROY

+1

是的,在當前的實現中,系統調用會產生收益。你永遠不需要使用runtime.Gosched在一個真正的程序。這隻適用於非常嚴格的處理循環。非緩衝通道使用,IO或內存分配將導致收益。在真正的節目中,我從未使用Gosched。 –

+1

@MrROY,似乎對系統調用的收益是最近的變化。我當然能夠在舊版本的Go編譯器上重現類似玩法的行爲。這確實使'Gosched'在大多數普通代碼中都過時了。 –

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缺失。也許這是故意的,用戶應該注意到這一點,並調查問題的原因。語言規範中的Program execution部分聲明如下:

當函數main返回時,程序退出。它不會等待其他(非主要)goroutines完成。

此聲明解釋了爲什麼程序打印少於10行。

正確的圍棋程序通常使用:

0

這是因爲你在呼喚它運行在您的編程環境之外的goroutine。從字面上看,兩個線程正在同時執行,並且輸出將是隨機的。

相關問題