http.listendServe:程序退出时关闭
我想写一个简单的RESTAPI应用程序。我编写了处理HTTP请求的代码: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
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正常关机,如下所述: