0

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

但是当我在调试器下运行这个程序然后停止它时,套接字被绑定,我可以从浏览器访问服务器,并且由于出现错误,我无法再次运行程序listen tcp :3000: bind: address already in use

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

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

4

1 回答 1

1

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

当你写

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

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

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

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

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

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

因此,只需删除go func() {块,你会没事的。

于 2018-05-17T17:40:50.527 回答