如果在循環中調用父函數,是否會復制從父函數傳遞到作為 goroutine 運行的閉包的參數?
因此,我想為每個 github 存儲庫運行一個單獨的 goroutine 以獲取其所有 PR 并將它們發送到各自的通道并合并所有這些通道以使用來自單個通道的不同存儲庫的所有 PR。這是代碼片段。func (c *Client) FetchAllPRs() { c.GetRepos() c.GetGitData() c.ghCollector.SetSHAMap(c.shaMap) start := time.Now() logging.Debug("TOTAL REPOS ", len(c.repos)) var channels []<-chan *sources.PRDetails for _, repo := range c.repos { channels = append(channels, c.ghCollector.GetPRNumbers(c.context, repo.Details)) } sink := mergePRChannels(channels) count := 0 for _ = range sink { count += 1 } elapsed := time.Since(start) logging.Info(count, " took time: ", elapsed)}func mergePRChannels(outputsChan []<-chan *sources.PRDetails) <-chan *sources.PRDetails { var wg sync.WaitGroup // make return channel merged := make(chan *sources.PRDetails) wg.Add(len(outputsChan)) output := func(sc <-chan *sources.PRDetails) { for sqr := range sc { merged <- sqr } // once channel (square numbers sender) closes, // call `Done` on `WaitGroup` to decrement counter wg.Done() } for _, optChan := range outputsChan { go output(optChan) } // run goroutine to close merged channel once done go func() { // wait until WaitGroup finishes wg.Wait() close(merged) }() return merged}現在來自 Github 的響應是分頁的,PR fetching goroutine 在其中運行一個循環。type PRDetails struct { RepoName string PR githubv4.Int}所以發生的情況是,它對于第一個請求運行良好,即它將為所有 repos 獲取前 100 個 PR 編號,但它永遠不會進入 for 循環以使用 Github API 返回的 EndCursor 獲取下一批。它不應該那樣做,現在我認為我傳遞給我的 goroutine 閉包的所有參數都是它們的副本或引用,其他一些 goroutine 可能會將 true 更改為 false,這沒有任何意義。由于c.ghCollector.GetPRNumbers 它在一個循環中運行,所以我假設每次調用這個函數時,在閉包之外聲明的所有變量都將為每個函數單獨實例化,并且我不需要任何互斥體來讀取或寫入。我很困惑,沒有任何意義。我在這里做錯了什么?
查看完整描述