为了账号安全,请及时绑定邮箱和手机立即绑定

服务器启动时的日志

服务器启动时的日志

Go
慕慕森 2021-11-29 16:29:18
http服务器启动时有没有办法打印一些东西?例如"Server is started at port 8080"在 Node(使用 Express)中,它会是这样的:app.listen(8080, function() { console.log('Server started at port 8080') });这是我的代码:func main() {    http.HandleFunc("/", MyHandler)    http.ListenAndServe(":8080", nil)}谢谢。
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

使用 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打开服务器端口,并永远阻塞等待客户端。如果打开端口失败,log.Fatal调用将报告问题并退出程序。


查看完整回答
反对 回复 2021-11-29
?
达令说

TA贡献1821条经验 获得超6个赞

您无法打印日志消息,ListenAndServe因为它会阻塞并且永远不会返回,因此基本上您有两个主要选择:

  1. 打印“在端口上启动服务器......”就这样 - 但是如果ListenAndServe无法启动它会返回一个错误,所以除非因此打印了一些错误或恐慌,否则您可以假设服务器已启动。

  2. 调用ListenAndServe一个单独的 goroutine,并确保没有返回错误并打印“服务器启动...”等。

我个人更喜欢第一种方法。


查看完整回答
反对 回复 2021-11-29
?
跃然一笑

TA贡献1826条经验 获得超6个赞

要ListenAndServe在 Not_a_Golfer 提到的 goroutine 中运行,您可以使用无缓冲的阻塞通道在 goroutine 中运行它并保持服务器处于活动状态。


下面的示例创建一个名为donewhere的通道,<-done它将在服务器等待 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

}


查看完整回答
反对 回复 2021-11-29
  • 3 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信