Функция reflect.FuncOf

Функция reflect.FuncOf создает новый тип функции во время выполнения программы. В первый параметр передается слайс типов аргументов, во второй - слайс типов результатов, третий параметр указывает, должна ли функция принимать переменное количество аргументов. Функция возвращает значение типа reflect.Type, представляющее созданный тип функции.

Синтаксис

goreflect.FuncOf(in []reflect.Type, out []reflect.Type, variadic bool) reflect.Type

Пример

Давайте создадим тип функции, принимающей два целых числа и возвращающей их сумму:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  intType := reflect.TypeOf(0)
  funcType := reflect.FuncOf(
    []reflect.Type{intType, intType},
    []reflect.Type{intType},
    false,
  )
  fmt.Println(funcType)
}

Результат выполнения кода:

go"func(int, int) int"

Пример

Давайте создадим тип функции, принимающей строку и возвращающей ее длину и саму строку:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  stringType := reflect.TypeOf("")
  intType := reflect.TypeOf(0)
  funcType := reflect.FuncOf(
    []reflect.Type{stringType},
    []reflect.Type{intType, stringType},
    false,
  )
  fmt.Println(funcType)
}

Результат выполнения кода:

go"func(string) (int, string)"

Пример

Давайте создадим функцию с переменным количеством аргументов, которая принимает любое количество целых чисел и возвращает их сумму:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  intType := reflect.TypeOf(0)
  funcType := reflect.FuncOf(
    []reflect.Type{intType},
    []reflect.Type{intType},
    true,
  )
  fmt.Println(funcType)
}

Результат выполнения кода:

go"func(int, ...int) int"

Пример

Давайте создадим функцию без аргументов, возвращающую строку:

gopackage main

import (
  "fmt"
  "reflect"
)

func main() {
  stringType := reflect.TypeOf("")
  funcType := reflect.FuncOf(
    []reflect.Type{},
    []reflect.Type{stringType},
    false,
  )
  fmt.Println(funcType)
}

Результат выполнения кода:

go"func() string"

Смотрите также

  • функцию reflect.TypeOf,
    которая возвращает тип переменной
  • функцию reflect.MakeFunc,
    которая создает функцию из созданного типа
  • функцию reflect.StructOf,
    которая создает структуру во время выполнения
  • функцию reflect.SliceOf,
    которая создает тип среза