首頁  >  文章  >  後端開發  >  Go程式語言書上的範例server2錯了?

Go程式語言書上的範例server2錯了?

王林
王林轉載
2024-02-05 23:06:08925瀏覽

Go程式語言書上的範例server2錯了?

問題內容

我正在閱讀《go 程式語言書籍》。在第 1 章,伺服器 2 範例中:書籍程式碼中,互斥體用於防止競爭條件。但是,我複製了程式碼並嘗試運行它,但結果不一致。範例中的程式碼是否錯誤?

這是我使用程式碼的方式:

server.go

#
package server

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

const (
    port string = ":8000"
)

var count int

var mu sync.mutex

func run() {
    http.handlefunc("/", handler)
    http.handlefunc("/count", counter)
    fmt.printf("server is listening on port: %s\n", port)
    log.fatal(http.listenandserve(port, nil))
}

func handler(w http.responsewriter, r *http.request) {
    mu.lock()
    count++
    mu.unlock()
    fmt.fprintf(w, "url path = %q\n", r.url.path)
}

func counter(w http.responsewriter, r *http.request) {
    mu.lock()
    fmt.fprintf(w, "count = %d\n", count)
    mu.unlock()
}

main.go

package main

import "book/server"

func main() {
    server.Run()
}

當我運行時: go run main.go 並訪問兩個頁面 localhost:8000 和 localhost:8000/count

  1. 每當我刷新 /count 頁面時,計數就會增加。為什麼?
  2. 每當我刷新 / 和 /count 頁面時,顯示的計數都會不一致地增加?不是按照刷新次數。為什麼?

我預計計數只會在我訪問 / 頁面而不是 /count 頁面時增加,並且會根據我刷新的次數而增加。


正確答案


那是因為當你用瀏覽器測試網頁時,大多數時候,瀏覽器也會向http://localhost: 8000/favicon.ico發送請求。請參閱下面的螢幕截圖:

/favicon.ico 沒有專用的處理程序,它與 / 匹配,因此將由 server.handler 處理。

建議使用其他工具來測試此類演示。例如,curl

$ curl 'http://localhost:8000/'
$ curl 'http://localhost:8000/count'

以上是Go程式語言書上的範例server2錯了?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除