E 'perché ogni richiesta in arrivo viene indirizzata alla funzione del gestore HelloWorld()
, e il browser rende più chiamate sotto il cofano, in particolare per /favicon.ico
.
E poiché il tuo server web non restituisce una favicon valida, lo richiederà di nuovo quando aggiorni la pagina nel browser.
Provalo con Chrome: apri gli strumenti di sviluppo (CTRL + MAIUSC + I) e seleziona la scheda "Rete". Hit di aggiornamento, e vedrete 2 nuove voci:
Name Status Type
--------------------------------------------------------
localhost 200 document
favicon.ico 200 text/plain
Dal momento che il contatore inizia con 0
(valore di default per il tipo int
), si incrementa una volta e si invia indietro 1
. Quindi la richiesta di favicon.ico
lo incrementa nuovamente (2
), ma il risultato non viene visualizzato. Quindi, se si aggiorna, viene nuovamente incrementato a 3
e lo si invia nuovamente, ecc.
Si noti inoltre che più goroutine possono servire richieste contemporaneamente, quindi la vostra soluzione ha una corsa. Si dovrebbe sincronizzare l'accesso alla variabile calls
, o utilizzare il pacchetto sync/atomic
per incrementare il contatore in modo sicuro, per esempio:
var calls int64
func HelloWorld(w http.ResponseWriter, r *http.Request) {
count := atomic.AddInt64(&calls, 1)
fmt.Fprintf(w, "You've called me %d times", count)
}
Un semplice "fix" per ottenere ciò che si desidera sarebbe quello di verificare il percorso di richiesta, e se non è la radice "/"
, non incrementare, ad esempio:
func HelloWorld(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/" {
return
}
count := atomic.AddInt64(&calls, 1)
fmt.Fprintf(w, "You've called me %d times", count)
}
si può anche scegliere di escludere solo le richieste per favicon.ico
, ad esempio:
if r.URL.Path == "/favicon.ico" {
return
}
stampa la richiesta uri per vedere ulteriori richieste inviate dal tuo browser. – dit