gpt4 book ai didi

http.ListenAndServe : Close when program exits

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:52 26 4
gpt4 key购买 nike

我想编写简单的 REST API 应用程序。我编写了处理 HTTP 请求的代码:

package main

import (
"fmt"
"log"
"movies/dao"
"net/http"

"github.com/gorilla/mux"
)

var d = dao.MoviesDAO{}

// AllMoviesEndPoint show all movies
func AllMoviesEndPoint(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "not implemented yet")
}

func init() {
d.Server = "127.0.0.1"
d.Database = "movies"
}

func main() {
//d.Connect()
router := mux.NewRouter()
router.HandleFunc("/movies", AllMoviesEndPoint).Methods("GET")

go func() {
if err := http.ListenAndServe(":3000", router); err != nil {
log.Fatal(err)
}
}()
}

但是当我在调试器下运行这个程序然后停止它时,套接字被绑定(bind),我可以从浏览器访问服务器,而且我不能再运行程序,因为我得到一个错误 listen tcp :3000:绑定(bind):地址已在使用中

程序退出时如何关闭连接?

现在我需要kill -9 PID 我的服务器来启动新的调试 session 。

最佳答案

问题不在调试器中,问题在您的代码中。

当你写作时

go func() {
if err := http.ListenAndServe(":3000", router); err != nil {
log.Fatal(err)
}
}()

您正在创建一个完全独立于主线程的新 goroutine。

这意味着您的 main 的执行是:

  1. 创建路由器
  2. 创建并执行一个 goroutine
  3. main 结束,返回并杀死所有 child

没有什么让 main 等待 go 例程执行和终止。

由于 http.ListenAndServe 创建了一个无限期等待新连接的线程,因此您不需要在 goroutine 中创建它。

因此,只需删除 go func() { block 就可以了。

关于http.ListenAndServe : Close when program exits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50396013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com