Go1.23 帶來了 go1.22 中實驗的 range-over-func 功能,如果有人讀過範例程式碼,你可能需要深思熟慮了。很長一段時間。不要那樣做。 P'Yod 會用非常簡單的方式解釋給你閱讀
從帶有範圍子句的 For 語句規範開始,新增了 3 種類型的表達式:
func(func() bool) func(func(V) bool) func(func(K, V) bool)
我想加一個變數來解釋如下
f func(yield func() bool) f func(yield func(V) bool) f func(yield func(K, V) bool)
規範規定,當我們在 rage 中使用函數 f 作為表達式時,每次在完成函數 f 之前調用yield 函數,我們都會在每次循環中得到結果。等於我們插入產量的值,當我解釋它時我仍然很困惑。最好寫程式
func main() { for range loop { fmt.Println("-") } } func loop(yield func() bool) { yield() yield() }
輸出:
- -
如果我們這樣寫程式碼,我們會得到2個完整的循環,因為根據規範我們在f中調用了兩次yield,這裡我們將其命名為loop,它不會返回任何東西給我們。因為我們選擇使用產量不接受任何參數的模式
另一個例子
func main() { for i := range loop { fmt.Println(i) } } func loop(yield func(int) bool) { yield(3) yield(7) }
輸出:
3 7
這樣我們也會得到2輪,因為我們呼叫了一次yield,現在range會回傳2個值,分別是3和7,我們每次都用它們來呼叫yield
另一個例子
func main() { for i := range loop { fmt.Println(i) } } func Loop(yield func(int, string) bool) { yield(3, "three") yield(5, "five") yield(7, "seven") }
輸出:
3 three 5 five 7 seven
我們會進行3次循環,依照每次放入的yield每次得到2個值
我們也可以透過插入任何類型的參數來呼叫yield,例如
func loop(yield func(string, bool) bool) { yield("three", true) yield("five", false) yield("seven", false) }
現在我們了解了它的機制。當我們閱讀困難的例子時,我們會理解更多,例如 Go Wiki 中的例子:Rangefunc Experiment
package slices func Backward[E any](s []E) func(func(int, E) bool) { return func(yield func(int, E) bool) { for i := len(s)-1; i >= 0; i-- { if !yield(i, s[i]) { return } } } }
主要
s := []string{"hello", "world"} for i, x := range slices.Backward(s) { fmt.Println(i, x) }
比較容易閱讀,對吧?最後,如何應用它取決於您。我們只看yield被呼叫了多少次。只有當你把它放在範圍內時你才會得到它
出來的數值就是投入到收益中的價值,就是這樣。
以上是Go 中的 range-over-func的詳細內容。更多資訊請關注PHP中文網其他相關文章!