«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > диапазон по функции в Go

диапазон по функции в Go

Опубликовано 29 августа 2024 г.
Просматривать:850

range-over-func in Go

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

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/pallat/range-over-func-in-go-oof?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3