3 回答

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊
使用等待組監(jiān)視寫入完成。
ch := make(chan string, len(links))
var wg sync.WaitGroup
for _, link := range links {
wg.Add(1)
go func(){
getLink(link, ch)
wg.Done()
}()
}
使用另一個(gè)例程偵聽(tīng)該事件并關(guān)閉通道。
go func(){
wg.Wait()
close(ch)
}()
for msg := range ch {
fmt.Println(msg)
}

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果您只啟動(dòng)N個(gè)(即)Go例程,所有這些例程都必然會(huì)發(fā)回一條消息,那么最簡(jiǎn)單的方法是在關(guān)閉通道之前從通道中讀取恰好N條消息。len(links)
不要越過(guò)頻道;當(dāng)您不知道將收到多少項(xiàng)目并且想要閱讀直到頻道關(guān)閉時(shí),這是最有用的。而是循環(huán)給定的次數(shù):range
// main:
for _ = range links {
fmt.Println(<-ch)
}
close(ch)

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
通過(guò)將 WaitGroup 添加到方法中來(lái)重構(gòu)它,getLink
func getLink(link string, wg *sync.WaitGroup, ch chan string)
和頻道在呼叫后關(guān)閉。wg.Wait()
go func() {
wg.Wait()
close(ch)
}()
因此,代碼的最終版本如下所示 ??
package main
import (
"fmt"
"net/http"
"sync"
)
var links = []string{
"https://mcevik.com",
"https://stackoverflow.com",
"https://www.linkedin.com",
"https://github.com",
"https://medium.com",
"https://kaggle.com",
}
func getLink(link string, wg *sync.WaitGroup, ch chan string) {
defer wg.Done()
if res, err := http.Get(link); err != nil {
ch <- err.Error()
} else {
ch <- fmt.Sprintf("[%d] - %s", res.StatusCode, link)
}
}
func main() {
wg := sync.WaitGroup{}
ch := make(chan string, len(links))
for _, link := range links {
wg.Add(1)
go getLink(link, &wg, ch)
}
go func() {
wg.Wait()
close(ch)
}()
for msg := range ch {
fmt.Println(msg)
}
}
https://play.golang.org/p/741F8eHrhFP
- 3 回答
- 0 關(guān)注
- 123 瀏覽
添加回答
舉報(bào)