Maison >développement back-end >Golang >Comment puis-je répertorier par programme les méthodes publiques dans un package Go ?

Comment puis-je répertorier par programme les méthodes publiques dans un package Go ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-05 10:33:46809parcourir

How Can I Programmatically List Public Methods in a Go Package?

Comment lister les méthodes publiques d'un package dans Go

Question :

Comment puis-je lister toutes les méthodes publiques disponibles dans un package spécifique dans Partir ?

Problème :

Considérez le projet suivant structure :

  • main.go:

    package main
    
    func main() {
      // List all public methods here.
    }
  • l ibs/method.go :

    package libs
    
    func Result1() {
      fmt.Println("Method Result1")
    }
    
    func Result2() {
      fmt.Println("Method Result2")
    }

Réponse :

Pendant que il peut paraître simple de lister des méthodes publiques en utilisant la réflexion, ce n'est malheureusement pas directement possible dans Go. En effet, le compilateur optimise les fonctions inutilisées et les supprime de l'exécutable final.

Approche alternative :

Si vous devez analyser les déclarations de fonction du package de manière statique, vous pouvez utilisez le package go/parser :

import (
    "fmt"
    "go/ast"
    "go/parser"
    "go/token"
    "os"
)

func main() {
    set := token.NewFileSet()
    packs, err := parser.ParseDir(set, "sub", nil, 0)
    if err != nil {
        fmt.Println("Failed to parse package:", err)
        os.Exit(1)
    }

    funcs := []*ast.FuncDecl{}
    for _, pack := range packs {
        for _, f := range pack.Files {
            for _, d := range f.Decls {
                if fn, isFn := d.(*ast.FuncDecl); isFn {
                    funcs = append(funcs, fn)
                }
            }
        }
    }

    fmt.Printf("All functions: %+v\n", funcs)
}

Cette approche vous fournira une liste de déclarations de fonctions, bien qu'elles soient non invocable. Pour exécuter ces fonctions, vous devrez créer un fichier séparé et les appeler individuellement.

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!

Déclaration:
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