2015-12-16 81 views
4

我開始於Go開發。有什麼方法可以在http服務器啓動時打印某些內容?例如"Server is started at port 8080"前往:服務器啓動時記錄

在節點(使用快遞),這將是這樣的:

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

這是我的代碼:

func main() { 
    http.HandleFunc("/", MyHandler) 
    http.ListenAndServe(":8080", nil) 
} 

感謝。

+0

相關:[進入:?我怎樣才能啓動瀏覽器後,服務器開始聽(http://stackoverflow.com/questions/32738188/go-how-can-i-start-the-browser -after最服務器開始聽) – icza

回答

6

使用Go的log包:

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調用將報告問題並退出程序。

5

ListenAndServe後,您不能打印日誌信息,因爲它會阻止和永遠不會返回,所以基本上你有兩個主要選擇:

  1. 打印「端口啓動服務器......」,這就是它 - 但是,如果ListenAndServe無法啓動,它將返回一個錯誤,因此除非出現某種錯誤或恐慌,否則可以假定服務器已啓動。

  2. 呼叫ListenAndServe在一個單獨的goroutine,並確保沒有錯誤返回,並打印「服務器開始......」等

我個人比較喜歡第一種方法。

1

要運行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 
} 

下面是已在服務器驗證它是可操作的,使用ListenServe單獨一個更大的示例。這樣做的好處是您可以輕鬆捕獲不正確的端口。

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 
}