要运行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