3 回答
TA贡献1796条经验 获得超7个赞
使用 Go 的日志包:
package main
import (
"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调用将报告问题并退出程序。
TA贡献1821条经验 获得超6个赞
您无法打印日志消息,ListenAndServe
因为它会阻塞并且永远不会返回,因此基本上您有两个主要选择:
打印“在端口上启动服务器......”就这样 - 但是如果
ListenAndServe
无法启动它会返回一个错误,所以除非因此打印了一些错误或恐慌,否则您可以假设服务器已启动。调用
ListenAndServe
一个单独的 goroutine,并确保没有返回错误并打印“服务器启动...”等。
我个人更喜欢第一种方法。
TA贡献1826条经验 获得超6个赞
要ListenAndServe在 Not_a_Golfer 提到的 goroutine 中运行,您可以使用无缓冲的阻塞通道在 goroutine 中运行它并保持服务器处于活动状态。
下面的示例创建一个名为donewhere的通道,<-done它将在服务器等待 goroutine 完成时保持活动状态,在这种情况下它不会。通常,goroutine 会通过执行来告诉主函数它已完成done <- true。
package main
import (
"log"
"net/http"
)
func MyHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World"))
}
func main() {
port := "8080"
http.HandleFunc("/", MyHandler)
done := make(chan bool)
go http.ListenAndServe(":"+port, nil)
log.Printf("Server started at port %v", port)
<-done
}
这是一个更大的示例,它让服务器验证它是否可以运行、使用Listen和Serve单独进行。这样做的好处是您可以轻松捕获不正确的端口。
package main
import (
"log"
"net"
"net/http"
"os"
)
func MyHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World"))
}
func main() {
port := "8080"
http.HandleFunc("/", MyHandler)
listener, err := net.Listen("tcp", ":"+port)
if err != nil {
log.Fatal(err)
}
done := make(chan bool)
go http.Serve(listener, nil)
// Log server started
log.Printf("Server started at port %v", port)
// Attempt to connect
log.Printf("Fetching...")
res, err := http.Get("http://" + listener.Addr().String())
log.Printf("Received: %v, %v", res, err)
if err != nil {
log.Fatal(err)
}
res.Write(os.Stdout)
<-done
}
- 3 回答
- 0 关注
- 214 浏览
添加回答
举报