Maison  >  Article  >  développement back-end  >  Comment obtenir le nom de la méthode en Golang

Comment obtenir le nom de la méthode en Golang

PHPz
PHPzoriginal
2023-04-25 09:10:451732parcourir

Lors de l'écriture du code du langage Go, vous devez parfois obtenir le nom de la fonction ou de la méthode actuelle pour la journalisation ou le débogage. Cet article explique comment obtenir le nom de la méthode en langage Go.

Le langage Go fournit un mécanisme de réflexion pour obtenir des informations de type au moment de l'exécution. À l'aide du mécanisme de réflexion, vous pouvez obtenir les informations de type de la fonction ou de la méthode actuelle et ainsi obtenir le nom de la méthode. Voici un exemple de programme simple :

package main

import (
    "fmt"
    "reflect"
    "runtime"
)

func main() {
    foo := Foo{}
    foo.Bar()
}

type Foo struct{}

func (f Foo) Bar() {
    fmt.Println(getFunctionName())
}

func getFunctionName() string {
    pc, _, _, _ := runtime.Caller(1)
    fn := runtime.FuncForPC(pc)
    return reflect.ValueOf(fn.Name()).String()
}

Exécutez le programme ci-dessus, le résultat est :

main.(Foo).Bar

Comme vous pouvez le voir, la fonction getFunctionName() renvoie le nom de la fonction ou de la méthode qui l'appelle actuellement. La fonction runtime.Caller() et la fonction runtime.FuncForPC() sont utilisées ici pour obtenir respectivement la valeur PC et l'objet fonction de l'appelant de la fonction ou de la méthode actuelle, puis utilisent le mécanisme de réflexion pour obtenir le nom de l'objet fonction. .

Il est à noter que le nom de fonction obtenu contient le nom du type auquel elle appartient, ainsi que le nom de la fonction elle-même. Par conséquent, le nom de fonction obtenu doit être traité dans le programme pour extraire le nom de la méthode ou le nom de la fonction.

Vous trouverez ci-dessous un exemple de programme plus complexe qui montre comment extraire le nom d'une fonction ou d'une méthode à partir du nom de la fonction.

package main

import (
    "fmt"
    "reflect"
    "runtime"
    "strings"
)

func main() {
    foo := Foo{}
    foo.Bar()
}

type Foo struct{}

func (f Foo) Bar() {
    fmt.Println(getMethodName())
}

func getMethodName() string {
    pc, _, _, _ := runtime.Caller(1)
    fn := runtime.FuncForPC(pc)
    fullName := fmt.Sprintf("%s", fn.Name())
    lastDotIndex := strings.LastIndex(fullName, ".")
    return fullName[lastDotIndex+1:]
}

Exécutez le programme ci-dessus, le résultat de sortie est :

Bar

Comme vous pouvez le voir, la fonction getMethodName() renvoie le nom de la méthode qui l'appelle actuellement. Ici, la fonction strings.LastIndex() est utilisée pour obtenir la position du dernier caractère "." dans le nom de la fonction, puis la chaîne est interceptée derrière la position pour obtenir le nom de la méthode.

Il convient de noter que la fonction getMethodName() dans l'exemple de programme ci-dessus ne convient que pour obtenir le nom de la méthode. Si vous avez besoin d'obtenir le nom de la fonction, vous devez écrire une logique de traitement différente.

En bref, le langage Go lui-même fournit des mécanismes de réflexion qui peuvent facilement obtenir des informations sur les fonctions ou les méthodes. Grâce au mécanisme de réflexion, nous pouvons obtenir des informations de type au moment de l'exécution, puis obtenir le nom, les paramètres et d'autres informations sur les fonctions ou méthodes, ce qui est très utile pour le développement, le débogage et l'optimisation de programmes.

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