要運行ListenAndServe
如Not_a_Golfer所述,您可以使用一個無緩衝的阻塞通道在goroutine中運行它,並使服務器保持活動狀態。
以下示例將創建一個名爲done
的通道,其中<-done
將在服務器等待goroutine完成時保持活動狀態,在此情況下不會執行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
}
相關:[進入:?我怎樣才能啓動瀏覽器後,服務器開始聽(http://stackoverflow.com/questions/32738188/go-how-can-i-start-the-browser -after最服務器開始聽) – icza