cpp

Сохранение в переменной ссылки на функцию

Ссылку на функцию можно сохранить в переменной. В этом случае объявление переменной выглядит так:

var <Переменная>[ func([<Типы параметров>])[ <Тип результата>]][ = 
    <Название функции без круглых скобок>]

Например, формат функции Ceil() выглядит следующим образом:

math.Ceil(x float64) float64

Сохраним ссылку на функцию Ceil() в переменной, а затем вызовем функцию через переменную:

var f func(float64) float64 = math.Ceil
fmt.Println(f(1.5)) // 2

Обратите внимание: название функции Ceil() указывается без круглых скобок. Если круглые скобки указать, то смысл операции будет другим: функция будет вызвана и результат будет присвоен переменной. Вызов функции через переменную осуществляется как вызов обычной функции. После переменной указываются круглые скобки, внутри которых передаются значения через запятую.

Сигнатуре func(float64) float64 соответствует также функция Floor(), поэтому ссылку на нее мы также можем сохранить в этой переменной:

f = math.Floor
fmt.Println(f(1.5)) // 1

Если при объявлении переменной производится инициализация, то тип данных можно не указывать:

var f = math.Ceil
fmt.Printf("%T\n", f) // func(float64) float64

Доступен также сокращенный формат объявления переменной:

f := math.Ceil
fmt.Printf("%T\n", f) // func(float64) float64

Пример сохранения ссылок на различные функции приведен в листинге 10.12.

Листинг 10.12. Сохранение в переменной ссылки на функцию

package main

import "fmt"

func main() {
   var f1 func() = test1
   f1()                    // OK
   var f2 func(int) = test2
   f2(10)                  // 10
   var f3 func(int, int) int = test3
   fmt.Println(f3(10, 20)) // 30
   var f4 func(int, int) (int, int) = test4
   fmt.Println(f4(40, 20)) // 60 20
   fmt.Printf("%T\n", f4)  // func(int, int) (int, int)
}
func test1() {
   fmt.Println("OK")
}
func test2(x int) {
   fmt.Println(x)
}
func test3(x, y int) int {
   return x + y
}
func test4(x, y int) (int, int) {
   return x + y, x - y
}

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp