Golang频道不要关闭

Golang channel do not close

我不明白,为什么频道没有关闭。 我使用 Waitgroup 显式等待并在它之后关闭通道......但是程序没有退出。 感谢您的帮助

( https://play.golang.org/p/lto2DytWH13 )

package main

import (
    "fmt"
    "net/http"
    "sync"
)

var wg sync.WaitGroup

func main() {
    links := []string{
        "http://google.com",
        "http://facebook.com",
        "http://whosebug.com",
        "http://golang.org",
        "http://amazon.com",
    }
    wg.Add(len(links))
    c := make(chan string)

    for _, link := range links {
        go checkLink(link, c, &wg)
    }
    wg.Wait()
    close(c)
    for u := range c {
        fmt.Println(u)
    }
}

func checkLink(link string, c chan string, wg *sync.WaitGroup) {
    _, err := http.Get(link)
    if err != nil {
        fmt.Println(link, "might be down!")
        c <- link
        return
    }

    fmt.Println(link, "is up!")
    c <- link
    wg.Done()
}

您的程序存在以下问题:

  • 当 goroutine 成功读取 link 时,它会打印 is up! 消息,并开始等待写入通道。主 goroutine 等待所有 goroutines 退出,然后关闭通道并从中读取。此时,所有的goroutines都睡着了。
  • 您正在关闭频道,并从中读取。这将立即 return 零值,即“”
  • 如果从 link 读取失败,您的 goroutines 将 return 不调用 wg.Done()

要修复,请使用:

    go func() {
        wg.Wait()
        close(c)
    }()