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
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3