この質問に対する彼の答え:Golang for Windows erratic behavior? user @distributed同時のゴルーチンの共有変数へのアクセスをロック/同期することをお勧めします。同時ゴルーチン中にGoの変数へのアクセスをロック/同期する方法は?
どうすればいいですか?
問題についてより:
私はこのコード(views
上の閉鎖と返される関数)同時に複数のゴルーチン上で実行されているを取得する:
func makeHomeHandler() func(c *http.Conn, r *http.Request) {
views := 1
return func(c *http.Conn, r *http.Request) {
fmt.Fprintf(c, "Counting %s, %d so far.", r.URL.Path[1:], views)
views++
}
}
IO機能がかかるように見えますそれは時間だし、結果として、私はこのような出力を得る:
Counting monkeys, 5 so far.
Counting monkeys, 5 so far.
Counting monkeys, 5 so far.
Counting monkeys, 8 so far.
Counting monkeys, 8 so far.
Counting monkeys, 8 so far.
Counting monkeys, 11 so far.
それは罰金インクリメントし、それを印刷しますときに私は運転印刷+ INCRそれを見ることができますエメンティングは原子ではありません。私はそれを変更した場合
:
func makeHomeHandler() func(c *http.Conn, r *http.Request) {
views := 0
return func(c *http.Conn, r *http.Request) {
views++
// I can only hope that other goroutine does not increment the counter
// at this point, i.e., right after the previous line and before the
// next one are executed!
views_now := views
fmt.Fprintf(c, "Counting %s, %d so far.", r.URL.Path[1:], views_now)
}
}
正常に動作するようですが、私はそれが最終的に失敗することはありません場合は完全にはわからない...
、[' expvar'パッケージ](https://golang.org/pkg/expvar/)も、あなたならば、別のオプションですHTTPを介して値を公開する必要があります(たとえば、リモートで実行されているサーバー上の値を照会するなど)。 –