2 回答

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
當(dāng)沒(méi)有更多的值要發(fā)送時(shí),您將關(guān)閉通道,因此在本例中,是在所有checkUrlgoroutine 完成時(shí)關(guān)閉。
var wg sync.WaitGroup
func checkUrls(urls []string) {
c := make(chan string)
for _, link := range urls {
wg.Add(1)
go checkUrl(link, c)
}
go func() {
wg.Wait()
close(c)
}()
for msg := range c {
fmt.Println(msg)
}
}
func checkUrl(url string, c chan string) {
defer wg.Done()
_, err := http.Get(url)
if err != nil {
c <- "We could not reach:" + url
} else {
c <- "Success reaching the website:" + url
}
}
(請(qǐng)注意,errorfromhttp.Get僅反映連接和協(xié)議錯(cuò)誤。如果您也期望這些錯(cuò)誤,那么它不會(huì)包含 http 服務(wù)器錯(cuò)誤,您必須看到如何檢查路徑而不僅僅是主機(jī)。)

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊
當(dāng)使用通道和 goroutine 在 Go 中編寫(xiě)程序時(shí),始終要考慮誰(shuí)(哪個(gè)函數(shù))擁有通道。我更喜歡讓擁有通道的函數(shù)關(guān)閉它的做法。如果我要寫(xiě)這個(gè),我會(huì)這樣做,如下所示。
注意:處理此類(lèi)情況的更好方法是扇出、扇入并發(fā)模式。
package main
import "fmt"
import "net/http"
import "sync"
func main() {
? ? links := []string{
? ? ? ? "https://github.com/fabpot",
? ? ? ? "https://github.com/andrew",
? ? ? ? "https://github.com/taylorotwell",
? ? ? ? "https://github.com/egoist",
? ? ? ? "https://github.com/HugoGiraudel",
? ? }
? ? processURLS(links)
? ? fmt.Println("End of Main")
}
func processURLS(links []string) {
? ? resultsChan := checkUrls(links)
? ? for msg := range resultsChan {
? ? ? ? fmt.Println(msg)
? ? }
}? ? ?
func checkUrls(urls []string) chan string {
? ? outChan := make(chan string)
? ? go func(urls []string) {
? ? ? ?defer close(outChan)
? ? ? ?var wg sync.WaitGroup
? ? ? ?for _, url := range urls {
? ? ? ? ?wg.Add(1)
? ? ? ? ? go checkUrl(&wg, url, outChan)
? ? ? ?}
? ? ? ?wg.Wait()
? ? }(urls)
? ? return outChan
}
func checkUrl(wg *sync.WaitGroup, url string, c chan string) {
? ? defer wg.Done()
? ? _, err := http.Get(url)
? ? if err != nil {
? ? ? ? c <- "We could not reach:" + url
? ? } else {
? ? ? ? c <- "Success reaching the website:" + url
? ? }
}
- 2 回答
- 0 關(guān)注
- 167 瀏覽
添加回答
舉報(bào)