http.listendServe:程序退出时关闭

http.listendServe:程序退出时关闭,http,go,Http,Go,我想写一个简单的RESTAPI应用程序。我编写了处理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.ResponseWrite

我想写一个简单的RESTAPI应用程序。我编写了处理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)
        }
    }()
}
但当我在调试器下运行这个程序,然后停止它时,套接字被绑定,我可以从浏览器访问服务器,并且我不能再次运行程序,因为我得到一个错误
listen tcp:3000:bind:address已经在使用中了

程序退出时如何关闭连接


现在我需要
kill-9pid
我的服务器来启动新的调试会话。

问题不在调试器中,问题在代码中

当你写作时

go func() {
    if err := http.ListenAndServe(":3000", router); err != nil {
        log.Fatal(err)
    }
}()
您正在创建一个完全独立于主线程的新goroutine

这意味着您的主要任务的执行是:

  • 创建路由器
  • 创建并执行goroutine
  • 干道结束,返回并杀死所有孩子
  • 没有任何东西使主程序等待go例程的执行和终止

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


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

    您使用的调试器是什么,如何启动它,以及“停止它”是什么意思?@Adrian,用VS-code对调试器进行深入研究。“停止它”是什么意思“selec Stop DEBUGGING您的程序无效:
    http.listendServe
    调用块,但您开始运行它的goroutine与运行
    main()的goroutine不同步
    ;当后者退出时,所有其他活动的goroutine都会被删除。您的程序在某种半自动状态下挂在那里的事实可能是由
    delve
    调试的结果,但该程序仍然无效:如果您只构建它并按原样运行,它会立即退出。@typemoon我认为您应该d为您的http正常关机,如下所述: