Maison > développement back-end > Golang > Passer les paramètres de la méthode à la fonction

Passer les paramètres de la méthode à la fonction

王林
Libérer: 2024-02-14 08:21:08
avant
1063 Les gens l'ont consulté

Passer les paramètres de la méthode à la fonction

Dans le développement PHP, transmettre des paramètres de méthode aux fonctions est une exigence courante. En passant des paramètres aux fonctions, nous pouvons exploiter et traiter les paramètres à l'intérieur de la fonction, obtenant ainsi un code plus flexible et réutilisable. Dans cet article, l'éditeur PHP Baicao présentera comment transmettre correctement les paramètres de méthode aux fonctions et partagera quelques conseils pratiques et précautions pour aider les développeurs à mieux comprendre et appliquer ce concept de programmation important. Que vous soyez débutant ou développeur expérimenté, cet article vous fournira des références et des conseils précieux.

Contenu de la question

Je suis curieux de savoir si cela est possible en go. J'ai un type avec plusieurs méthodes. Est-il possible d'avoir une fonction qui prend un paramètre de méthode et l'appelle ensuite pour ce type ?

Voici un petit exemple de ce que je souhaite :

package main

import (
    "fmt"
)

type Foo int

func (f Foo) A() {
    fmt.Println("A")
}
func (f Foo) B() {
    fmt.Println("B")
}
func (f Foo) C() {
    fmt.Println("C")
}

func main() {
    var f Foo
    bar := func(foo func()) {
        f.foo()
    }
    bar(A)
    bar(B)
    bar(C)
}
Copier après la connexion

go considère une méthode de type foo 有一个名为 foo() au lieu de la remplacer par le nom de la méthode transmis.

Solution de contournement

Oui, c'est possible. Vous avez 2 (3) choix :

Spécification : expression de méthode

expression foo.a 产生一个与 a 等效的函数,但具有显式接收器作为其第一个参数;它有签名 func(f foo).

var foo foo
bar := func(m func(f foo)) {
    m(foo)
}
bar(foo.a)
bar(foo.b)
bar(foo.c)
Copier après la connexion

Ce récepteur de méthode est explicite. Vous transmettez simplement le nom de la méthode (et son type) à bar(),并且在调用它时,您必须传递实际的接收者:m(f).

Sortie comme prévu (essayez sur go terrain de jeu) :

a
b
c
Copier après la connexion

Spécification : valeur de la méthode

Si ffoo 类型的值,则表达式 f.a 生成 func() 类型的函数值,其隐式接收者值为 f.

var f foo
bar := func(m func()) {
    m()
}
bar(f.a)
bar(f.b)
bar(f.c)
Copier après la connexion

Veuillez noter que la méthode Receiver ici est implicite, elle est la même que celle qui est transmise à bar() 的函数值一起保存,因此无需显式指定即可调用它:m().

Le résultat est le même (essayez-le sur le go terrain de jeu).

(Pour être complet : Réflexion)

Inférieur à la solution précédente (en termes de performances et de "sécurité"), mais vous pouvez transmettre le nom de la méthode sous forme de package string 值传递,然后使用 reflect pour appeler la méthode par ce nom. Cela pourrait ressembler à ceci :

var f Foo
bar := func(name string) {
    reflect.ValueOf(f).MethodByName(name).Call(nil)
}
bar("A")
bar("B")
bar("C")
Copier après la connexion

Essayez-le sur le go terrain de jeu.

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: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