首頁  >  文章  >  後端開發  >  Go 中的 range-over-func

Go 中的 range-over-func

WBOY
WBOY原創
2024-08-19 04:42:32498瀏覽

range-over-func in Go

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn