Замыкание литерала функции в Go
Литерал можно записать внутри другой функции. Тело литерала читает локальные переменные этой функции - не только собственные параметры. При вызове используется текущее значение такой переменной:
package main
import "fmt"
func main() {
base := 10
addBase := func(x int) int {
return x + base
}
fmt.Println(addBase(5)) // выведет 15
}
Одно число снаружи удобно задавать шаг или смещение для короткого литерала:
package main
import "fmt"
func buildScale() func(int) int {
step := 3
return func(x int) int {
return x * step
}
}
func main() {
scale := buildScale()
fmt.Println(scale(4)) // выведет 12
}
Строку из окружения можно подставить в результат без отдельного параметра литерала:
package main
import "fmt"
func main() {
tag := "id"
label := func(num int) string {
return tag + ": " + fmt.Sprintf("%d", num)
}
fmt.Println(label(7)) // выведет id: 7
}
Внутри main задайте limit
равным 50. Запишите литерал с
целым параметром, который возвращает
меньшее из аргумента и limit.
Выведите результат для 80.
Внутри main задайте строку
"go". Запишите литерал без
параметров, который возвращает эту
строку. Выведите два вызова подряд.