0Pricing
Go Academy · Lektion

Dynamische Funktionsaufrufe

Funktionen aufrufen und Werte über reflect setzen

Dynamische Funktionsaufrufe ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

reflect.Value.Call

Value.Call(args) ruft die durch den Value dargestellte Funktion mit den angegebenen Argumenten (als []reflect.Value) auf und gibt die Ergebnisse als []reflect.Value zurück.

fn := reflect.ValueOf(add)
results := fn.Call([]reflect.Value{
    reflect.ValueOf(2),
    reflect.ValueOf(3),
})
fmt.Println(results[0].Int()) // 5

Argumenttypen prüfen

Stellen Sie vor dem Aufruf sicher, dass die Argumenttypen mit der Funktionssignatur übereinstimmen. Nicht übereinstimmende Typen führen zu einem Panic.

t := reflect.TypeOf(fn)
if t.NumIn() != len(args) { panic("wrong arg count") }
for i, arg := range args {
    if !reflect.TypeOf(arg).AssignableTo(t.In(i)) { panic("type mismatch") }
}

Variadische Funktionen

Rufen Sie eine variadische Funktion mit Value.Call (wobei der Slice aufgeteilt wird) oder Value.CallSlice (wobei die variadischen Argumente als Slice-Wert übergeben werden) auf:

sum := reflect.ValueOf(func(ns ...int) int {
    total := 0
    for _, n := range ns { total += n }
    return total
})
args := reflect.ValueOf([]int{1,2,3})
results := sum.CallSlice([]reflect.Value{args})

reflect.MakeFunc

reflect.MakeFunc erstellt zur Laufzeit eine neue Funktion mit einem vorgegebenen Typ und einem Wrapper-Body. Es wird verwendet, um Adapterfunktionen für Interfaces zu erzeugen.

t := reflect.TypeOf(func(int) string { return "" })
fn := reflect.MakeFunc(t, func(args []reflect.Value) []reflect.Value {
    return []reflect.Value{reflect.ValueOf(strconv.Itoa(args[0].Interface().(int)))}
})

Methoden anhand des Namens aufrufen

Eine Methode anhand ihres Namens abrufen und aufrufen:

v := reflect.ValueOf(myObj)
m := v.MethodByName("Process")
if m.IsValid() {
    m.Call(nil)
}

Prüfen, ob eine Methode existiert

Prüfen Sie vor dem Aufruf immer m.IsValid() – MethodByName gibt den Nullwert Value zurück, wenn die Methode nicht gefunden wird, und der Aufruf des Nullwerts führt zu einem Panic.

Anwendungsfälle für dynamisches Dispatching

Dynamische Funktionsaufrufe werden in Plugin-Systemen (Funktionen anhand eines Stringnamens aufrufen), Test-Frameworks (TestXxx-Funktionen aufrufen), RPC-Dispatchern (Methodennamen Handlern zuordnen) und Decorators verwendet.

Performance

reflect.Call ist etwa 10- bis 50-mal langsamer als ein direkter Aufruf. Cachen Sie den reflect.Value häufig aufgerufener Funktionen und vermeiden Sie deren Verwendung in zeitkritischen Schleifen.

Typsicherer Wrapper

Kapseln Sie dynamische Aufrufe in einem typisierten Helper, der die Reflection-Logik einmal beim Start ausführt und anschließend wiederholt den gecachten Value aufruft:

type Processor func(context.Context, []byte) ([]byte, error)
// Build at startup, reuse at request time

Fehler-Rückgabewerte behandeln

Wenn die Funktion als letztes Ergebnis einen Fehler zurückgibt, extrahieren und prüfen Sie ihn:

results := fn.Call(args)
if !results[len(results)-1].IsNil() {
    return results[len(results)-1].Interface().(error)
}

Alternativen zu Reflection

Wenn die Menge der Funktionen zur Compile-Zeit bekannt ist, verwenden Sie statt Reflection eine Map aus Funktionswerten (map[string]func(...)) – sie ist sicherer und schneller.

handlers := map[string]func(ctx context.Context, req []byte) []byte{
    "greet": greetHandler,
}

Kurzer Check

Was gibt reflect.Value.Call zurück?

Zusammenfassung: Dynamische Funktionsaufrufe

Wichtige Punkte:

  • Value.Call([]reflect.Value) ruft die Funktion auf und gibt []reflect.Value zurück
  • Vor dem Aufruf des Ergebnisses von MethodByName m.IsValid() prüfen
  • MakeFunc erstellt zur Laufzeit eine neue Funktion mit einem vorgegebenen Typ
  • Für bekannte Funktionsmengen map[string]func statt Reflection bevorzugen

Häufig gestellte Fragen

Ist die Lektion „Dynamische Funktionsaufrufe“ kostenlos?

Ja — der vollständige Text von „Dynamische Funktionsaufrufe“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Dynamische Funktionsaufrufe“?

Funktionen aufrufen und Werte über reflect setzen Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Go Academy zu starten?

Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Dynamische Funktionsaufrufe“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?

Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. reflect.Type und reflect.Value
  2. Struct-Felder und Tags untersuchen
  3. Dynamische Funktionsaufrufe
  4. Praktische Reflection: Serialisierer
← Zurück zu Go Academy