РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1518 of 1593 menu

reflect.Value.MethodByName

Метод reflect.Value.MethodByName возвращает метод, привязанный к значению, по его имени. В первый параметр мы передаем имя метода в виде строки. Метод возвращает значение типа reflect.Value, которое представляет собой функцию. Если метод с указанным именем не найден, возвращается нулевое значение reflect.Value, проверить которое можно методом IsValid. Для успешного вызова полученного метода, его необходимо вызвать через метод Call, передав слайс аргументов.

Синтаксис

value.MethodByName(name)

Пример

Давайте получим метод структурного значения по имени и вызовем его с аргументом:

package main import ( "fmt" "reflect" ) type Person struct { Name string Age int } func (p Person) Greet(greeting string) string { return fmt.Sprintf("%s, %s!", greeting, p.Name) } func main() { p := Person{Name: "Alice", Age: 30} v := reflect.ValueOf(p) method := v.MethodByName("Greet") if method.IsValid() { args := []reflect.Value{reflect.ValueOf("Hello")} res := method.Call(args) fmt.Println(res[0].Interface()) } }

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

"Hello, Alice!"

Пример

Рассмотрим случай, когда метод с указанным именем не существует. В этом случае MethodByName возвращает невалидное значение:

package main import ( "fmt" "reflect" ) type Person struct { Name string Age int } func (p Person) Greet(greeting string) string { return fmt.Sprintf("%s, %s!", greeting, p.Name) } func main() { p := Person{Name: "Bob", Age: 25} v := reflect.ValueOf(p) method := v.MethodByName("NonExistentMethod") if method.IsValid() { fmt.Println("Method found") } else { fmt.Println("Method not found") } }

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

"Method not found"

Пример

Метод MethodByName также может работать с методами, принимающими несколько аргументов и возвращающими несколько значений:

package main import ( "fmt" "reflect" ) type Calculator struct{} func (c Calculator) Add(a, b int) (int, string) { sum := a + b return sum, fmt.Sprintf("Sum is %d", sum) } func main() { calc := Calculator{} v := reflect.ValueOf(calc) method := v.MethodByName("Add") if method.IsValid() { args := []reflect.Value{ reflect.ValueOf(10), reflect.ValueOf(20), } res := method.Call(args) fmt.Println(res[0].Interface()) fmt.Println(res[1].Interface()) } }

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

30 "Sum is 30"

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

  • метод reflect.Value.Method,
    который возвращает метод по индексу
  • метод reflect.Value.Call,
    который вызывает функцию или метод
  • функцию reflect.Type.Method,
    которая возвращает информацию о методе типа
  • функцию reflect.Value.IsValid,
    которая проверяет валидность значения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить