我有一個結構:type MultiServer struct { servers []*http.Server}func New(servers ...*http.Server) *MultiServer { return &MultiServer{servers: servers}}func (m *MultiServer) ListenAndServe() error { var g errgroup.Group for _, s := range m.servers { s := s g.Go(s.ListenAndServe) } return g.Wait()}ListenAndServe如果其中一臺服務器返回錯誤,我希望它立即返回。所以我將不正確的端口傳遞給其中一臺服務器:func TestListenAndServe(t *testing.T) { one := makeServer(":8080") two := makeServer("::8080") // that is incorrect port ms := New(one, two) done := make(chan error) go func() { done <- ms.ListenAndServe() }() select { case err := <-done: if err == nil { t.Fatal("error expected") } case <-makeTimeChan(5 * time.Second): t.Fatal("timeout") }}func makeServer(port string) *http.Server { serveMux := http.NewServeMux() hello := func(w http.ResponseWriter, req *http.Request) { fmt.Fprintf(w, "hello\n") } serveMux.HandleFunc("/hello", hello) return &http.Server{ Addr: port, Handler: serveMux, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, }}func makeTimeChan(d time.Duration) <-chan time.Time { t := time.NewTimer(d) return t.C}如果我的 MultiServer 有不止一臺服務器,我會不斷地“超時”。我認為這與循環運行服務器有關,因為如果我替換ListenAndServe為:func (m *MultiServer) ListenAndServe() error { var g errgroup.Group for _, s := range m.servers { _= s g.Go(func(){ return errors.New("")}) } return g.Wait()}一切都按預期工作。有人可以幫我解決我做錯了什么嗎?
在錯誤組中運行多個服務器的問題
慕的地8271018
2022-06-27 17:22:30