2 回答

TA貢獻1909條經驗 獲得超7個贊
當沒有更多的值要發送時,您將關閉通道,因此在本例中,是在所有checkUrlgoroutine 完成時關閉。
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
}
}
(請注意,errorfromhttp.Get僅反映連接和協議錯誤。如果您也期望這些錯誤,那么它不會包含 http 服務器錯誤,您必須看到如何檢查路徑而不僅僅是主機。)

TA貢獻1784條經驗 獲得超2個贊
當使用通道和 goroutine 在 Go 中編寫程序時,始終要考慮誰(哪個函數)擁有通道。我更喜歡讓擁有通道的函數關閉它的做法。如果我要寫這個,我會這樣做,如下所示。
注意:處理此類情況的更好方法是扇出、扇入并發模式。
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 關注
- 172 瀏覽
添加回答
舉報