猿问

服务器启动时的日志

http服务器启动时有没有办法打印一些东西?例如"Server is started at port 8080"


在 Node(使用 Express)中,它会是这样的:


app.listen(8080, function() { console.log('Server started at port 8080') });

这是我的代码:


func main() {

    http.HandleFunc("/", MyHandler)

    http.ListenAndServe(":8080", nil)

}

谢谢。


慕慕森
浏览 215回答 3
3回答

芜湖不芜

使用 Go 的日志包:package mainimport (    "net/http"    "log")func main() {    addr := ":8080"    http.HandleFunc("/", MyHandler)    log.Println("listen on", addr)    log.Fatal( http.ListenAndServe(addr, nil) )}http.ListenAndServe打开服务器端口,并永远阻塞等待客户端。如果打开端口失败,log.Fatal调用将报告问题并退出程序。

达令说

您无法打印日志消息,ListenAndServe因为它会阻塞并且永远不会返回,因此基本上您有两个主要选择:打印“在端口上启动服务器......”就这样 - 但是如果ListenAndServe无法启动它会返回一个错误,所以除非因此打印了一些错误或恐慌,否则您可以假设服务器已启动。调用ListenAndServe一个单独的 goroutine,并确保没有返回错误并打印“服务器启动...”等。我个人更喜欢第一种方法。

跃然一笑

要ListenAndServe在 Not_a_Golfer 提到的 goroutine 中运行,您可以使用无缓冲的阻塞通道在 goroutine 中运行它并保持服务器处于活动状态。下面的示例创建一个名为donewhere的通道,<-done它将在服务器等待 goroutine 完成时保持活动状态,在这种情况下它不会。通常,goroutine 会通过执行来告诉主函数它已完成done <- true。package mainimport (&nbsp; &nbsp; "log"&nbsp; &nbsp; "net/http")func MyHandler(w http.ResponseWriter, r *http.Request) {&nbsp; &nbsp; w.Write([]byte("Hello World"))}func main() {&nbsp; &nbsp; port := "8080"&nbsp; &nbsp; http.HandleFunc("/", MyHandler)&nbsp; &nbsp; done := make(chan bool)&nbsp; &nbsp; go http.ListenAndServe(":"+port, nil)&nbsp; &nbsp; log.Printf("Server started at port %v", port)&nbsp; &nbsp; <-done}这是一个更大的示例,它让服务器验证它是否可以运行、使用Listen和Serve单独进行。这样做的好处是您可以轻松捕获不正确的端口。package mainimport (&nbsp; &nbsp; "log"&nbsp; &nbsp; "net"&nbsp; &nbsp; "net/http"&nbsp; &nbsp; "os")func MyHandler(w http.ResponseWriter, r *http.Request) {&nbsp; &nbsp; w.Write([]byte("Hello World"))}func main() {&nbsp; &nbsp; port := "8080"&nbsp; &nbsp; http.HandleFunc("/", MyHandler)&nbsp; &nbsp; listener, err := net.Listen("tcp", ":"+port)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; }&nbsp; &nbsp; done := make(chan bool)&nbsp; &nbsp; go http.Serve(listener, nil)&nbsp; &nbsp; // Log server started&nbsp; &nbsp; log.Printf("Server started at port %v", port)&nbsp; &nbsp; // Attempt to connect&nbsp; &nbsp; log.Printf("Fetching...")&nbsp; &nbsp; res, err := http.Get("http://" + listener.Addr().String())&nbsp; &nbsp; log.Printf("Received: %v, %v", res, err)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; }&nbsp; &nbsp; res.Write(os.Stdout)&nbsp; &nbsp; <-done}
随时随地看视频慕课网APP

相关分类

Go
我要回答