0


0

Windowsの不安定な動作ですか?
  Update:  The question title can be misleading.  This was not Go's fault at all.
           See the first comment or the accepted answer.

次のコード(まあ、ほぼ同じ)は、Linuxではページビューをカウントしますが、Windowsではページビューを2回カウントします。

誰かが理由を理解できますか?

package main

import (
 "fmt"
    "http"
)

func main() {
    println("Running")
    http.HandleFunc("/", makeHomeHandler())
 http.ListenAndServe(":8080", nil)
}

// this version compiles and run OK under the Linux version of Golang
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++
    }
}

/*
// this version compiles and run OK under the mingw version of Golang
// it uses a different argument type for the handler function,
// but the counter says "1 so far", then "3 so far", "5 so far", and so on.
func makeHomeHandler() func(c http.ResponseWriter, r *http.Request) {
    views := 1
    return func(c http.ResponseWriter, r *http.Request) {
     fmt.Fprintf(c, "Counting %s, %d so far.", r.URL.Path[1:], views)
        views++
    }
}
*/

Mingwの下:

http://localhost:8080/monkeys => Counting monkeys, 1 so far.
http://localhost:8080/monkeys => Counting monkeys, 3 so far.
http://localhost:8080/donkeys => Counting donkeys, 5 so far.

これはバグでしょうか。

ファローアップ:

実際、次のような別のページの追加ハンドラーを定義すると、

   http.HandleFunc("/test", testPageHandler)

Wichにはクロージャはなく、また何もインクリメントしません。カウンタはとにかくインクリメントされますが、+ 1のみです。

だから、まだMingwの下で:

http://localhost:8080/monkeys => Counting monkeys, 1 so far.
http://localhost:8080/monkeys => Counting monkeys, 3 so far.
http://localhost:8080/test   => Another handler function that does not increment "views"
http://localhost:8080/donkeys => Counting donkeys, 6 so far.

Linuxでの出力は予想通りです。

http://localhost:8080/monkeys => Counting monkeys, 1 so far.
http://localhost:8080/monkeys => Counting monkeys, 2 so far.
http://localhost:8080/test   => Another handler function that does not increment "views"
http://localhost:8080/donkeys => Counting donkeys, 3 so far.

1 Answer


5


表示されている動作は、ブラウザがページのファビコンを要求しているためであり、Windows / mingwによるものではないと思われます。 ご参考までに、私は6g ond Darwinを使用しています。私のFirefox 3.6はMac OS Xでも実行されています。

私の疑いを強調するには、ハンドラー関数に次を追加してみてください。

fmt.Printf("Counting %s, %d so far.\n", r.URL.Path[1:], views)

その後、アプリケーションに到達するすべてのリクエストを確認できます。 新しく起動されたFirefoxからURL http:// localhost:8080 / chuchichaestliへの1つのリクエストにより、次の出力が生成されます。

Counting chuchichaestli, 1 so far.
Counting favicon.ico, 2 so far.

Firefoxはgoページのファビコンも要求するためです。

さらに、複数の同時リクエストがあっても、「ビュー」へのアクセスをロック/同期していません。