http.ListenAndServe:程序退出时关闭

时间:2018-05-17 16:07:23

标签: http go

我想编写简单的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)
        }
    }()
}

但是当我在调试器下运行这个prgram然后停止它时,socket被绑定了,我可以从浏览器访问服务器,并且因为我收到错误listen tcp :3000: bind: address already in use而无法再运行程序。

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

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

1 个答案:

答案 0 :(得分:0)

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

写作时

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

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

这意味着你的主要执行是:

  1. 创建路由器
  2. 创建并执行goroutine
  3. 主要结束,返回并杀死所有孩子
  4. 没有任何东西让主要的等待进行常规执行和终止。

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

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