Go1.23 добавил функцию range-over-func, которая была экспериментом в go1.22 и будет использоваться по-настоящему. Если кто-то читал пример кода, возможно, вам придется это сделать. помедитировать немного. Не делай этого. П'Йод объяснит очень просто, чтобы вы могли прочитать
Начиная со спецификации операторов 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)
В спецификации сказано, что когда мы используем функцию f в качестве выражения в rage, каждый раз, когда мы вызываем там функцию доходности перед завершением функции f, мы получаем результат в каждом цикле. Равен значению, которое мы вставили в доходность. Я все еще не понимаю, когда объясняю это. Лучше напишите код
func main() { for range loop { fmt.Println("-") } } func loop(yield func() bool) { yield() yield() }
выход:
- -
Если мы напишем такой код, мы получим 2 полных цикла, потому что мы вызываем выход 2 раза в f согласно спецификации, здесь мы называем его циклом, и он ничего нам не вернет. Потому что мы решили использовать шаблон с выходом, который не принимает никаких аргументов
Другой пример
func main() { for i := range loop { fmt.Println(i) } } func loop(yield func(int) bool) { yield(3) yield(7) }
выход:
3 7
Таким образом, мы также получим 2 раунда, потому что мы вызываем выход один раз, и теперь диапазон будет возвращать 2 значения: 3 и 7, которые мы используем для вызова доходности каждый раз
Другой пример
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 цикла и получим 2 значения в каждом цикле в соответствии с тем, что мы каждый раз вкладываем в доходность
И мы также можем вызвать выход, вставив аргументы любого типа, например
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) }
Гораздо легче читать, не так ли? В конце концов, как это применить – решать вам. Мы смотрим только на то, сколько раз вызывается доходность. Вы получите его только тогда, когда поместите его в радиус действия
Значение, которое выйдет, — это значение, добавленное в доходность End
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3