Литерал функции параметром функции в Go
Параметр функции может принимать другую
функцию. Для этого у параметра указывают
тип func с тем же списком аргументов
и результатом. Внутри функции такой
аргумент вызывают как обычную функцию:
package main
import "fmt"
func applyTwice(value int, fn func(int) int) int {
first := fn(value)
return fn(first)
}
func main() {
add1 := func(n int) int {
return n + 1
}
fmt.Println(applyTwice(3, add1)) // выведет 5
}
Литерал без аргументов подходит для отложенного действия. Функция может вызвать переданный блок один или несколько раз:
package main
import "fmt"
func runSafe(fn func()) {
fmt.Println("begin")
fn()
fmt.Println("end")
}
func main() {
work := func() {
fmt.Println("work")
}
runSafe(work)
}
Литерал с результатом bool удобен
для проверки значения:
package main
import "fmt"
func checkValue(n int, fn func(int) bool) bool {
return fn(n)
}
func main() {
even := func(n int) bool {
return n % 2 == 0
}
fmt.Println(checkValue(8, even)) // выведет true
}
Напишите функцию combine с двумя
целыми и параметром типа
func(int, int) int.
Функция возвращает результат литерала для
этих чисел. Выведите результат для
6 и 7 так, чтобы вернулось
их произведение.
Напишите функцию repeatAction:
целое times и параметр типа
func().
Тело литерала должно выполниться столько
раз, сколько задано в times.
Проверьте выводом строки "tick"
три раза.