」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Go 中的 range-over-func

Go 中的 range-over-func

發佈於2024-08-29
瀏覽:165

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,它不會返回任何東西給我們。因為我們選擇使用一個不接受任何參數的yield模式

另一個例子

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被呼叫了多少次。只有當你把它放在範圍
中時你才會得到它 出來的數值就是投入收益的數值。 End

版本聲明 本文轉載於:https://dev.to/pallat/range-over-func-in-go-oof?1如有侵犯,請洽[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3