我想编写简单的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
我的服务器启动新的调试会话。
答案 0 :(得分:0)
问题不在调试器中,问题在于您的代码。
写作时
go func() {
if err := http.ListenAndServe(":3000", router); err != nil {
log.Fatal(err)
}
}()
你正在创建一个完全独立于主线程的新goroutine。
这意味着你的主要执行是:
没有任何东西让主要的等待进行常规执行和终止。
由于http.ListenAndServe
创建了一个无限期等待新连接的线程,因此您无需在goroutine中创建它。
因此,只需删除go func() {
块,您就可以了。