Je suis désolé de ne pas avoir pu être plus précis dans le titre de la question, mais je lisais du code Go et j'ai rencontré des déclarations de fonction de ce formulaire:
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
...
}
depuis https://github.com/mattermost/platform/blob/master/api/context.go
func (s *GracefulServer) BlockingClose() bool {
...
}
depuis https://github.com/braintree/manners/blob/master/server.go
Qu'est - ce que la (h handler)
et (s *GracefulServer)
entre parenthèses moyenne? Que signifie toute la déclaration de fonction, compte tenu de la signification des choses entre parenthèses?
Éditer
Ce n'est pas un doublon de Quelle est la différence de fonctions et de méthodes dans Go? : cette question m'est venue parce que je ne savais pas ce qu'il y avait entre parenthèses avant le nom de la fonction, pas parce que je me demandais quelle était la différence entre les fonctions et les méthodes ... si je savais que cette déclaration était une méthode que je ne ferais pas '' t ont eu cette question en premier lieu. Si quelqu'un a un jour le même doute que moi, je ne crois pas qu'elle ira chercher des "méthodes de golang" car elle ne sait pas que c'est le cas. Ce serait comme se demander ce que la lettre «sigma» signifie avant une expression mathématique (ne pas savoir qu'elle signifie sommation) et quelqu'un dit que c'est un doublon de ce qui fait la différence entre la sommation et une autre chose.
De plus, la réponse courte à cette question ("c'est un récepteur") n'est pas une réponse à "quelle est la différence entre les fonctions et les méthodes".
n
élément de la liste dans Haskell? , qui se trouve dans l'introduction sur Learn you a Haskell for Great Good et obtenez des réponses à leurs questions sans faire d'histoires à ce sujet.Réponses:
C'est ce qu'on appelle le «récepteur». Dans le premier cas,
(h handler)
il s'agit d'un type de valeur, dans le second,(s *GracefulServer)
il s'agit d'un pointeur. La façon dont cela fonctionne dans Go peut varier un peu de certaines autres langues. Cependant, le type de réception fonctionne plus ou moins comme une classe dans la plupart des programmes orientés objet. C'est la chose à partir de laquelle vous appelez la méthode, un peu comme si je mettais une méthodeA
dans une classe,Person
alors j'aurais besoin d'une instance de typePerson
pour appelerA
(en supposant que c'est une méthode d'instance et non statique!).Un problème ici est que le récepteur est poussé sur la pile d'appels comme les autres arguments, donc si le récepteur est un type de valeur, comme dans le cas,
handler
vous travaillerez sur une copie de ce que vous avez appelé la méthode à partir de ce qui signifierait quelque chose comme leh.Name = "Evan"
ferait ne persiste pas après que vous revenez à la portée d'appel. Pour cette raison, tout ce qui s'attend à changer l'état du récepteur, doit utiliser un pointeur ou retourner la valeur modifiée (donne plus d'un paradigme de type immuable si vous le recherchez).Voici la section pertinente de la spécification; https://golang.org/ref/spec#Method_sets
la source
Cela signifie que ce
ServeHTTP
n'est pas une fonction autonome. La parenthèse devant le nom de la fonction est le moyen Go de définir l'objet sur lequel ces fonctions vont opérer. Donc, c'est essentiellementServeHTTP
une méthode de type handler et peut être invoquée en utilisant n'importe quel objet, disons h, de type handler.Ils sont également appelés récepteurs. Il existe deux façons de les définir. Si vous souhaitez modifier le récepteur, utilisez un pointeur comme:
Si vous n'avez pas besoin de modifier le récepteur, vous pouvez définir le récepteur comme une valeur comme:
Cet exemple de Go Playground illustre le concept.
Le résultat du programme ci-dessus est:
la source