Maison > développement back-end > Golang > Comment puis-je exécuter dynamiquement du code Go comme eval() de JavaScript ?

Comment puis-je exécuter dynamiquement du code Go comme eval() de JavaScript ?

Mary-Kate Olsen
Libérer: 2024-11-08 03:41:01
original
985 Les gens l'ont consulté

How Can I Dynamically Execute Go Code Like JavaScript's eval()?

Exécuter du code/des expressions Go comme Eval() de JavaScript

En JavaScript, la méthode eval() vous permet d'exécuter du code de manière dynamique en fonction de une entrée de chaîne. Existe-t-il une fonctionnalité similaire disponible dans Go ?

Solution

Oui, il est possible d'obtenir une fonctionnalité similaire avec Go en utilisant l'approche suivante :

Utilisation de packages, d'étendues et de constantes :

  1. Créer un package : Définissez un package personnalisé dans votre code Go.
  2. Créer un scope : Créez un objet Scope dans le package pour représenter l'environnement dans lequel le code sera évalué.
  3. Insérer des constantes : Insérez des constantes dans le scope du package. Ces constantes représentent les valeurs et les variables disponibles pour l'évaluation.
  4. Construire des constantes : Utilisez la fonction types.NewConst() pour construire des constantes avec les informations de type appropriées.

Exemple d'utilisation :

Voici un extrait de code qui montre comment évaluer des expressions simples dans Go :

import (
    "fmt"

    "go/types"
)

func main() {
    // Create a new package
    pkg := types.NewPackage("mypkg", "github.com/example/mypkg")

    // Create a new scope
    scope := types.NewScope(pkg, nil)

    // Insert constants into the scope
    scope.Insert(types.NewConst("x", types.Int, types.NewInt64(10)))
    scope.Insert(types.NewConst("y", types.Int, types.NewInt64(20)))

    // Evaluate simple expressions
    expr1 := "x * y"
    expr2 := "2 + 2"
    expr3 := "x + 17"
    result1, _ := evaluate(pkg, scope, expr1)
    result2, _ := evaluate(pkg, scope, expr2)
    result3, _ := evaluate(pkg, scope, expr3)

    // Print the results
    fmt.Println(result1, result2, result3)
}

// evaluate takes a package, scope, and expression and evaluates the expression in the provided scope.
func evaluate(pkg *types.Package, scope *types.Scope, expr string) (types.Object, error) {
    // Check the expression
    if expr == "" {
        return nil, fmt.Errorf("empty expression")
    }

    // Parse the expression
    parsed, err := types.ParseExpr(expr)
    if err != nil {
        return nil, err
    }

    // Evaluate the expression
    return pkg.Check(parsed.Pos(), parsed), nil
}
Copier après la connexion

Ce code évaluera les expressions fournies dans le portée du package personnalisé, vous permettant d'évaluer dynamiquement le code en fonction des chaînes d'entrée.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal