Неустойчивое поведение в Windows? - PullRequest
0 голосов
/ 13 октября 2010
  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.

Может кто-нибудь выяснить почему?

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.

Может ли это быть ошибкой?

Followup:

На самом деле, если я определю дополнительный обработчик для другой страницы, например:

   http.HandleFunc("/test", testPageHandler)

У которого нет замыкания и ничего не увеличивается, счетчик все равно увеличивается, но только +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 Ответ

5 голосов
/ 13 октября 2010

Я подозреваю, что поведение, которое вы видите, связано с тем, что браузер запрашивает значок для вашей страницы, а не из-за 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 выдает такой вывод:

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

потому что Firefox также запрашивает значок для вашей страницы перехода.

Кроме того, вы не блокируете / не синхронизируете доступ к views, хотя может быть несколько одновременных запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...