2015-12-16 99 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 
}