为什么goroutine会阻止此http服务器中的main func?

为什么goroutine会阻止此http服务器中的main func?,go,Go,我想设置一个http服务器,在两个端口8888和8080上侦听httprouter,就像下面的代码一样 package main import ( "fmt" "github.com/julienschmidt/httprouter" "log" "net/http" ) func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { fmt.Fprint(w, "We

我想设置一个http服务器,在两个端口
8888
8080
上侦听httprouter,就像下面的代码一样

package main

import (
    "fmt"
    "github.com/julienschmidt/httprouter"
    "log"
    "net/http"
)

func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    fmt.Fprint(w, "Welcome!\n")
}

func main() {
    router := httprouter.New()
    router.GET("/", Index)

    fmt.Println("listen on 8080")
    // this is where blocked
    go log.Fatal(http.ListenAndServe(":8080", router))
    fmt.Println("listen on 8888")
    log.Fatal(http.ListenAndServe(":8888", router))
}
但它不能正常工作,我的服务器只监听
8080
。如果我做了一些更改:

go func() { log.Fatal(http.ListenAndServe(":8080", router)) }()
它在
8080
8888
上都能很好地工作。为什么呢?是关于结束还是别的什么

函数值和参数在调用goroutine中按常规进行计算

-


您正在为调用
log.Fatal
创建一个goroutine,但是
log.Fatal
的参数会在主goroutine中预先计算。而
Fatal
的参数是
http.ListenAndServe
的返回值。因此,新的goroutine在
ListenAndServe
返回后才会启动。

因为
http.ListenAndServe()
正在阻塞,在您的场景中,有两个,然后尝试将其中一个放入goroutine中。其思想是将这两个web服务器初始化语句的执行分离到单独的goroutine中

func main() {
    router := httprouter.New()
    router.GET("/", Index)

    go func() {
        fmt.Println("listen on 8080")
        log.Fatal(http.ListenAndServe(":8080", router))
    }()

    fmt.Println("listen on 8888")
    log.Fatal(http.ListenAndServe(":8888", router))
}