http.ListenAndServe: Закрыть при выходе из программы - PullRequest
0 голосов
/ 17 мая 2018

Я хочу написать простое приложение 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 мой сервер, чтобы начать новый сеанс отладки.

1 Ответ

0 голосов
/ 17 мая 2018

Проблема не в отладчике, проблема в вашем коде.

Когда вы пишете

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

, вы создаете новую программу, полностью независимую от основного потока..

Это означает, что выполнение вашего main:

  1. Create router
  2. Создание и выполнение goroutine
  3. end of main, returnи убить всех потомков

Нет ничего, что заставляло бы главного ожидать выполнения и завершения процедуры go.

Поскольку http.ListenAndServe создает поток, который бесконечно ждет новых подключений, вы неНе нужно создавать его внутри программы.

Следовательно, просто удалите блок go func() {, и все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...