Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 运行一个简单的服务器,但是计数器似乎上升了3,为什么?_Http_Go - Fatal编程技术网

Http 运行一个简单的服务器,但是计数器似乎上升了3,为什么?

Http 运行一个简单的服务器,但是计数器似乎上升了3,为什么?,http,go,Http,Go,我这里有个小服务器。其目的是,如果我访问localhost:8000/*它应该将计数器增加1,如果我访问localhost:8000/count,它应该向我显示当前的计数器 奇怪的是,每次我访问localhost:8000,计数器都会上升3。因此,我将转到localhost:8000/count,计数器将位于3,然后我访问localhost:8000,然后再次访问localhost:8000/count,计数器将位于6。为什么会这样?net/http有什么奇怪的地方吗 另外,为什么当我刷新loc

我这里有个小服务器。其目的是,如果我访问localhost:8000/*它应该将
计数器
增加1,如果我访问localhost:8000/count,它应该向我显示当前的
计数器

奇怪的是,每次我访问
localhost:8000
,计数器都会上升3。因此,我将转到
localhost:8000/count
计数器将位于3,然后我访问
localhost:8000
,然后再次访问
localhost:8000/count
计数器将位于6。为什么会这样?
net/http
有什么奇怪的地方吗

另外,为什么当我刷新
localhost:8000/count
时,计数会增加1乘1?
计数器
func不会增加
count
,但
count
仍然会增加-这是为什么?
handler
是否也被添加到
localhost:8000/count
路由

package main

import (
        "fmt"
        "log"
        "net/http"
        "sync"
)

var mu sync.Mutex
var count int

func main() {
        http.HandleFunc("/", handler)
        http.HandleFunc("/count", counter)
        log.Fatal(http.ListenAndServe("localhost:8000", nil))
}

// handler echoes the Path component of the requested URL.
func handler(w http.ResponseWriter, r *http.Request) {
        mu.Lock()
        count++
        mu.Unlock()
        fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}

// counter echoes the number of calls so far.
func counter(w http.ResponseWriter, r *http.Request) {
        mu.Lock()
        fmt.Fprintf(w, "Count %d\n", count)
        mu.Unlock()
}

额外的请求是您的浏览器试图访问/favicon.ico


例如,如果您在处理程序函数中将http.Request打印到stdout,您可以看到这一点。

问题在于处理程序正在提供额外的静态内容,如
favicon
等。如果您记录请求,您将看到您的浏览器可能也在请求 /favicon.ico,它将被传递给同一个处理程序

提供静态内容的一种方法是创建自己的内容:


记录命中“handler”函数的URL(在文件中或stdout上)。你可能收到了法维康之类的额外请求。不知道为什么我没有想到这一点。谢谢。我正在记录它,这就是我发现的:每次我的浏览器点击url时,它也会请求一个favicon,就像你@aedolon和@simo说的那样。另外,对于
localhost:8000/count“,
handler`和
counter
似乎都被击中了。有趣的东西。您的浏览器可能(不同的浏览器可能表现不同)在访问/count时也试图抓取favicon,但favicon请求都由
handler
处理,因为“/”是最好的,也是唯一匹配的”/@LeibnizMan:再次检查加载“/count”页面时点击的所有URL。可能您的浏览器会发送额外的请求。对favicon.ico的请求数量和重复次数取决于您的浏览器及其缓存方式:在我的PC(firefox-linux)上,我只看到第一页加载中的
+3
步骤;之后,计数器“按预期”递增。谢谢你的回答。我接受@Aedolon的答案,因为他是第一个-但就我所知,你同样正确:D
package main

import (
    "fmt"
    "net/http"
    "strings"
)   

var chttp = http.NewServeMux()

func main() {

    chttp.Handle("/", http.FileServer(http.Dir("./")))

    http.HandleFunc("/", HomeHandler) // homepage
    http.ListenAndServe(":8080", nil)
}   

func HomeHandler(w http.ResponseWriter, r *http.Request) {

    if (strings.Contains(r.URL.Path, ".")) {
        chttp.ServeHTTP(w, r)
    } else {
        fmt.Fprintf(w, "HomeHandler")
    }   
}