我在 Go 中编写了一个基本的 Web 服务器,但它似乎无法正确处理任何请求,而我得到的只是“接收失败:对等方重置连接”。我很高兴服务器确实可以正确启动和停止,并且我可以看到它正在侦听我配置的端口 8080。我还排除了解析 YAML 配置文件的问题——它肯定会被解析到 http.Server{}。我真的不知道还有什么要检查的,并且努力寻找任何指向正确方向的东西。我也会提前道歉,因为我知道我在下面粘贴了大量代码,但我真的不知道错误来自什么以及来自哪里。鉴于服务器正在运行,当我点击“/”端点/路由时,我希望得到“Hello from Go!” 回来了。目录结构❯ tree . | grep -iE 'cmd|server.go|go.mod|go.sum|server.yaml'├── cmd│ └── server.go├── go.mod├── go.sum└── server.yaml服务器.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贡献1784条经验 获得超2个赞
正如评论中提到的,这个问题与超时值太短有关——每个 5 纳秒。这是因为 time.Duration 表示为两个瞬间之间经过的时间,以 int64 纳秒计数。所以我需要将其转换为几秒钟,以获得我所期望的。
从文档:
“持续时间将两个瞬间之间的经过时间表示为 int64纳秒计数。该表示将最大可表示持续时间限制为大约 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 关注
- 85 浏览
添加回答
举报
0/150
提交
取消