Mehrere Funktionstypen im Mapping, Golang

WBOY
Freigeben: 2024-02-12 08:39:09
nach vorne
856 Leute haben es durchsucht

Mehrere Funktionstypen im Mapping, Golang

Map ist eine leistungsstarke Datenstruktur in Golang, die es uns ermöglicht, einen Wert einem anderen Wert zuzuordnen. In Golang können wir Zuordnungen verwenden, um verschiedene Arten von Funktionen zu implementieren. Der PHP-Editor Youzi stellt in diesem Artikel verschiedene Funktionstypen im Mapping vor, darunter gewöhnliche Funktionen, anonyme Funktionen und Methoden. Darüber hinaus untersuchen wir, wie Funktionen als Werte in Zuordnungen verwendet werden, und demonstrieren ihre Leistungsfähigkeit und Flexibilität. Unabhängig davon, ob Sie Anfänger oder erfahrener Golang-Entwickler sind, bietet Ihnen dieser Artikel nützliches Wissen und Beispiele, die Ihnen helfen, Funktionstypen in Zuordnungen besser zu verstehen und anzuwenden. Beginnen wir mit der Erkundung!

Frageninhalt

Ich möchte Benutzereingaben mit einer Funktion verbinden. Die Benutzereingabe ist eine Zeichenfolge. Zum Beispiel, "func_name=MyPrintf&s1=你好,世界!" oder "func_name=MyAdd&i1=1&i2=2"

Der Code jeder Funktion lautet:

func MyPrintf(s1 string) {
    fmt.Println(s1)
}

func MyAdd(i1, i2 int) {
    fmt.Println(i1, i2)
}
Nach dem Login kopieren

Ich hätte gerne eine Karte wie die untenstehende,

type Myfunc func(string) | func(int, int)   // <- Of course, it's wrong code, just I hope like this.

myMap := make(map[string]Myfunc)

myMap["MyPrintf"] = MyPrintf
myMap["MyAdd"] = MyAdd
Nach dem Login kopieren

myMap kann Funktionen über die vom Benutzer eingegebene Zeichenfolge func_name aufrufen.

myMap[func_name](s1) Ausgabe: Hallo Welt! myMap[func_name](i1, i2) Ausgabe: 3

Ist das möglich? Vielleicht denke ich, dass die Verwendung von „eval“ möglich ist, aber ich habe gehört, dass die Verwendung von „eval“ schlecht ist. Also dachte ich darüber nach, Funktionszeiger zu verwenden, aber in Golang gibt es keine Funktionszeiger.

Ich habe einige allgemeine Golang-Programmierung ausprobiert,

type Myfunc interface {
    func(string) | func(int, int)
}

myMap := make(map[string]Myfunc)
Nach dem Login kopieren

Ausgabe: Fehler aufgetreten: Typ Myfunc kann nicht außerhalb von Typeinschränkungen verwendet werden: Schnittstelle enthält Typeinschränkungen

Versuchen Sie es noch einmal,

myMap := make(map[string]interface{})

myMap["MyPrintf"] = interface{}(MyPrintf)
myMap["MyPrintf"].(func(string))("Hello, world!")
Nach dem Login kopieren

Ausgabe: Hallo Welt!

myMap["MyAdd"] = interface{}(MyAdd)
myMap["MyAdd"].(func(int,int))(1, 2)
Nach dem Login kopieren

Ausgabe: 3

Es funktioniert, aber Sie müssen den richtigen Funktionstyp angeben, was nicht sehr komfortabel ist. Ich denke, dieser Weg ist für mein Szenario nicht geeignet. Bitte gebt mir Hilfe. Es tut mir leid für meine schlechte englische Schreibweise.

Lösung

Sie können Folgendes versuchen:

Ich muss sagen, dass dies keine gute Vorgehensweise ist, da Panikfehler aufgrund falscher Typen nicht überprüft werden. Ich werde einen anderen Ansatz in Betracht ziehen.

package main

import "fmt"

type GeneralFunc func(args ...interface{})

func main() {
    // Create a map of functions with the type GeneralFunc
    functionsMap := map[string]GeneralFunc{
        "MyPrintf": func(args ...interface{}) { fmt.Println(args[0].(string)) },
        "MyAdd":    func(args ...interface{}) { fmt.Println(args[0].(int), args[1].(int)) },
    }

    // Use the functions from the map
    functionsMap["MyPrintf"]("Hello World")
    functionsMap["MyAdd"](2, 3)
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonMehrere Funktionstypen im Mapping, Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!