Maison > développement back-end > Golang > Plusieurs types de fonctions dans la cartographie, Golang

Plusieurs types de fonctions dans la cartographie, Golang

WBOY
Libérer: 2024-02-12 08:39:09
avant
906 Les gens l'ont consulté

Plusieurs types de fonctions dans la cartographie, Golang

Map est une structure de données puissante dans Golang qui nous permet d'associer une valeur à une autre valeur. Dans Golang, nous pouvons utiliser des mappages pour implémenter différents types de fonctions. L'éditeur PHP Youzi présentera différents types de fonctions de mappage dans cet article, y compris les fonctions ordinaires, les fonctions et méthodes anonymes. De plus, nous explorerons comment utiliser les fonctions comme valeurs dans les mappages et démontrerons leur puissance et leur flexibilité. Que vous soyez un développeur Golang débutant ou expérimenté, cet article vous fournira des connaissances utiles et des exemples pour vous aider à mieux comprendre et appliquer les types de fonctions dans les mappages. Commençons à explorer !

Contenu de la question

Je souhaite connecter l'entrée utilisateur à une fonction. L'entrée utilisateur est une chaîne. Par exemple, "func_name=MyPrintf&s1=你好,世界!" ou "func_name=MyAdd&i1=1&i2=2"

Le code de chaque fonction est,

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

func MyAdd(i1, i2 int) {
    fmt.Println(i1, i2)
}
Copier après la connexion

Je voudrais une carte comme celle ci-dessous,

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
Copier après la connexion

myMap peut appeler des fonctions via la chaîne func_name saisie par l'utilisateur.

myMap[func_name](s1) Résultat : Bonjour tout le monde ! myMap[func_name](i1, i2) Sortie : 3

Est-ce possible ? Peut-être que je pense qu'utiliser "eval" est possible, mais j'ai entendu dire que l'utilisation de "eval" était mauvaise. J'ai donc pensé à utiliser des pointeurs de fonction, mais il n'y a pas de pointeurs de fonction dans Golang.

J'ai essayé un peu de programmation générale Golang,

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

myMap := make(map[string]Myfunc)
Copier après la connexion

Sortie : une erreur s'est produite : impossible d'utiliser le type Myfunc en dehors des contraintes de type : l'interface contient des contraintes de type

Réessayez,

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

myMap["MyPrintf"] = interface{}(MyPrintf)
myMap["MyPrintf"].(func(string))("Hello, world!")
Copier après la connexion

Sortie : Bonjour tout le monde !

myMap["MyAdd"] = interface{}(MyAdd)
myMap["MyAdd"].(func(int,int))(1, 2)
Copier après la connexion

Sortie : 3

Cela fonctionne, mais il faut spécifier le bon type de fonction, ce qui n'est pas très confortable. Je pense que cette méthode ne convient pas à mon scénario. S'il vous plaît, donnez-moi de l'aide. Je suis désolé pour ma mauvaise écriture en anglais.

Solution

Vous pouvez essayer ceci :

Je dois dire que ce n'est pas une bonne pratique car les erreurs de panique dues à des types incorrects ne sont pas vérifiées. Je vais envisager une autre approche.

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)
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal