幕布斯7119047
2022-10-31 16:52:41
我在 Go 中編寫了一個基本的 Web 服務(wù)器,但它似乎無法正確處理任何請求,而我得到的只是“接收失?。簩Φ确街刂眠B接”。我很高興服務(wù)器確實可以正確啟動和停止,并且我可以看到它正在偵聽我配置的端口 8080。我還排除了解析 YAML 配置文件的問題——它肯定會被解析到 http.Server{}。我真的不知道還有什么要檢查的,并且努力尋找任何指向正確方向的東西。我也會提前道歉,因為我知道我在下面粘貼了大量代碼,但我真的不知道錯誤來自什么以及來自哪里。鑒于服務(wù)器正在運行,當(dāng)我點擊“/”端點/路由時,我希望得到“Hello from Go!” 回來了。目錄結(jié)構(gòu)? tree . | grep -iE 'cmd|server.go|go.mod|go.sum|server.yaml'├── cmd│ └── server.go├── go.mod├── go.sum└── server.yaml服務(wù)器.gopackage mainimport ( "context" "errors" "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" "gopkg.in/yaml.v3")type Config struct { Port string `yaml:"Port"` ReadTimeout int `yaml:"ReadTimeout"` WriteTimeout int `yaml:"WriteTimeout"` IdleTimeout int `yaml:"IdleTimeout"` ShutdownTimeout int `yaml:"ShutdownTimeout"` ErrorLog string `yaml:"ErrorLog"`}func main() { if len(os.Args) != 2 { log.Fatal("Missing arguments") } configFile, err := os.Open(os.Args[1]) if err != nil { log.Fatal(err) } defer configFile.Close() // TODO: Implement a custom ServeMux + routes serverConfig := Config{} yamlDecoder := yaml.NewDecoder(configFile) err = yamlDecoder.Decode(&serverConfig) if err != nil { log.Fatal(err) } errorLogFile, err := os.OpenFile(serverConfig.ErrorLog, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { log.Fatal(err) } defer errorLogFile.Close() errorLog := log.New(errorLogFile, "ERROR : ", log.LstdFlags|log.Lshortfile) server := &http.Server{ Addr: fmt.Sprintf(":%s", serverConfig.Port), ReadTimeout: time.Duration(serverConfig.ReadTimeout), WriteTimeout: time.Duration(serverConfig.WriteTimeout), IdleTimeout: time.Duration(serverConfig.IdleTimeout), ErrorLog: errorLog, } http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello from Go!") })
1 回答

一只斗牛犬
TA貢獻(xiàn)1784條經(jīng)驗 獲得超2個贊
正如評論中提到的,這個問題與超時值太短有關(guān)——每個 5 納秒。這是因為 time.Duration 表示為兩個瞬間之間經(jīng)過的時間,以 int64 納秒計數(shù)。所以我需要將其轉(zhuǎn)換為幾秒鐘,以獲得我所期望的。
從文檔:
“持續(xù)時間將兩個瞬間之間的經(jīng)過時間表示為 int64納秒計數(shù)。該表示將最大可表示持續(xù)時間限制為大約 290 年。”
解決方案:
server := &http.Server{
Addr: fmt.Sprintf(":%s", serverConfig.Port),
ReadTimeout: time.Duration(serverConfig.ReadTimeout) * time.Second,
WriteTimeout: time.Duration(serverConfig.WriteTimeout) * time.Second,
IdleTimeout: time.Duration(serverConfig.IdleTimeout) * time.Second,
ErrorLog: errorLog,
}
- 1 回答
- 0 關(guān)注
- 102 瀏覽
添加回答
舉報
0/150
提交
取消