Литерал функции (или лямбда) - это функция без имени.
В этом примере литерал функции передается в качестве аргумента less функции sort.Slice.
func Slice(slice interface{}, less func(i, j int) bool)
people := []string{"Alice", "Bob", "Dave"}
sort.Slice(people, func(i, j int) bool {
return len(people[i]) < len(people[j])
})
fmt.Println(people)
// Вывод: [Bob Dave Alice]
Вы также можете использовать промежуточную переменную.
people := []string{"Alice", "Bob", "Dave"}
less := func(i, j int) bool {
return len(people[i]) < len(people[j])
}
sort.Slice(people, less)
Обратите внимание, что функция less является замыканием: она ссылается на переменную people, которая объявлена вне функции.
Замыкания
Литералы функций в Go являются замыканиями: они могут ссылаться на переменные, определенные в окружающей функции. Такие переменные
- являются общими между окружающей функцией и литералом функции,
- сохраняются в памяти, пока к ним можно получить доступ.
В этом примере литерал функции использует локальную переменную n из окружающей области видимости, чтобы подсчитать, сколько раз он был вызван.
// New возвращает функцию Count.
// Count печатает количество раз, которое она был вызван.
func New() (Count func()) {
n := 0
return func() {
n++
fmt.Println(n)
}
}
func main() {
f1, f2 := New(), New()
f1() // 1
f2() // 1 (другая n)
f1() // 2
f2() // 2
}
Читайте также:
Комментариев нет:
Отправить комментарий