亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果在循環中調用父函數,是否會復制從父函數傳遞到作為 goroutine 運行的閉包的參數?

如果在循環中調用父函數,是否會復制從父函數傳遞到作為 goroutine 運行的閉包的參數?

Go
侃侃無極 2022-05-23 15:51:48
因此,我想為每個 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 它在一個循環中運行,所以我假設每次調用這個函數時,在閉包之外聲明的所有變量都將為每個函數單獨實例化,并且我不需要任何互斥體來讀取或寫入。我很困惑,沒有任何意義。我在這里做錯了什么?
查看完整描述

1 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

以下程序


package main                                                                                                                                                                                                       


import "fmt"                                                                                                                                                                                                       


func main() {                                                                                                                                                                                                      

  test("a", "b")                                                                                                                                                                                                   

  select {}                                                                                                                                                                                                        

}                                                                                                                                                                                                                  


func test(text1, text2 string) {                                                                                                                                                                                   

 go func(t1 string) {                                                                                                                                                                                              

  for {                                                                                                                                                                                                            

    fmt.Println(t1, text2)                                                                                                                                                                                         

  }                                                                                                                                                                                                                

 }(text1)                                                                                                                                                                                                          

 text1 = "1"                                                                                                                                                                                                       

 text2 = "2"                                                                                                                                                                                                       

}                                                                                                                                                                                                                  

僅從某個時間點到結束


a 2

它表明,如果您通過參數將某些內容傳遞給閉包,則它是單獨的變量。如果您使用周圍的函數變量,它不會被復制。


查看完整回答
反對 回復 2022-05-23
  • 1 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號