3 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超7個(gè)贊
使用 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打開(kāi)服務(wù)器端口,并永遠(yuǎn)阻塞等待客戶(hù)端。如果打開(kāi)端口失敗,log.Fatal調(diào)用將報(bào)告問(wèn)題并退出程序。

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊
您無(wú)法打印日志消息,ListenAndServe
因?yàn)樗鼤?huì)阻塞并且永遠(yuǎn)不會(huì)返回,因此基本上您有兩個(gè)主要選擇:
打印“在端口上啟動(dòng)服務(wù)器......”就這樣 - 但是如果
ListenAndServe
無(wú)法啟動(dòng)它會(huì)返回一個(gè)錯(cuò)誤,所以除非因此打印了一些錯(cuò)誤或恐慌,否則您可以假設(shè)服務(wù)器已啟動(dòng)。調(diào)用
ListenAndServe
一個(gè)單獨(dú)的 goroutine,并確保沒(méi)有返回錯(cuò)誤并打印“服務(wù)器啟動(dòng)...”等。
我個(gè)人更喜歡第一種方法。

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
要ListenAndServe在 Not_a_Golfer 提到的 goroutine 中運(yùn)行,您可以使用無(wú)緩沖的阻塞通道在 goroutine 中運(yùn)行它并保持服務(wù)器處于活動(dòng)狀態(tài)。
下面的示例創(chuàng)建一個(gè)名為donewhere的通道,<-done它將在服務(wù)器等待 goroutine 完成時(shí)保持活動(dòng)狀態(tài),在這種情況下它不會(huì)。通常,goroutine 會(huì)通過(guò)執(zhí)行來(lái)告訴主函數(shù)它已完成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
}
這是一個(gè)更大的示例,它讓服務(wù)器驗(yàn)證它是否可以運(yùn)行、使用Listen和Serve單獨(dú)進(jìn)行。這樣做的好處是您可以輕松捕獲不正確的端口。
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 關(guān)注
- 249 瀏覽
添加回答
舉報(bào)