selector是將變量傳遞給回調(diào)函數(shù)的方法嗎?for _, selector := range listSelector { c.OnHTML(selector, func(e *colly.HTMLElement) { fmt.Println(selector) // Similar outputs })}預(yù)期結(jié)果是輸出的不同選擇器。謝謝。
1 回答

守著星空守著你
TA貢獻(xiàn)1799條經(jīng)驗 獲得超8個贊
根據(jù)回調(diào)執(zhí)行的時間,您可能需要在塊內(nèi)創(chuàng)建迭代變量的副本并在閉包中使用它。
for _, selector := range listSelector {
? ? sel := selector // create a copy
? ? c.OnHTML(sel, func(e *colly.HTMLElement) {
? ? ? ? fmt.Println(sel) // Similar outputs
? ? })
}
如果回調(diào)被執(zhí)行并且它在循環(huán)中的下一次迭代之前退出,則不需要執(zhí)行此操作,但是如果稍后執(zhí)行回調(diào),則需要將迭代變量的副本傳遞給閉包。這是因為迭代變量被重用來保存迭代的值,這意味著當(dāng)前迭代中的變量值將被下一次迭代中的值覆蓋。
從規(guī)格來看:
迭代變量可以通過“range”子句使用短變量聲明(:=)的形式來聲明。在這種情況下,它們的類型設(shè)置為各自迭代值的類型,并且它們的范圍是“for”語句的塊;它們在每次迭代中都被重復(fù)使用。如果迭代變量在“for”語句之外聲明,則執(zhí)行后它們的值將是最后一次迭代的值。
- 1 回答
- 0 關(guān)注
- 174 瀏覽
添加回答
舉報
0/150
提交
取消