Es tut mir leid, dass ich im Titel der Frage nicht genauer sein konnte, aber ich habe einen Go- Code gelesen und bin auf Funktionsdeklarationen dieser Form gestoßen:
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
...
}
von https://github.com/mattermost/platform/blob/master/api/context.go
func (s *GracefulServer) BlockingClose() bool {
...
}
von https://github.com/braintree/manners/blob/master/server.go
Was bedeutet das (h handler)
und das (s *GracefulServer)
zwischen Klammern? Was bedeutet die gesamte Funktionsdeklaration unter Berücksichtigung der Bedeutung der Dinge in Klammern?
Bearbeiten
Dies ist kein Duplikat von Was ist der Unterschied zwischen Funktionen und Methoden in Go? : Diese Frage kam zu mir, weil ich nicht wusste, was die Dinge in Klammern vor dem Funktionsnamen waren, nicht weil ich mich fragte, was der Unterschied zwischen Funktionen und Methoden war ... wenn ich wüsste, dass diese Deklaration eine Methode ist, würde ich nicht ' Ich hatte diese Frage überhaupt nicht. Wenn jemand eines Tages den gleichen Zweifel wie ich hat, glaube ich nicht, dass sie nach "Golang-Methoden" suchen wird, weil sie nicht weiß, dass dies der Fall ist. Es wäre, als würde man sich fragen, was der Buchstabe "Sigma" vor einem mathematischen Ausdruck bedeutet (ohne zu wissen, dass er Summation bedeutet), und jemand sagt, es sei ein Duplikat dessen, was den Unterschied zwischen Summation und etwas anderem ausmacht.
Die kurze Antwort auf diese Frage ("es ist ein Empfänger") ist auch keine Antwort auf "Was ist der Unterschied zwischen Funktionen und Methoden?".
n
Element aus der Liste in Haskell entfernen? , das in der Einführung zu Learn you a Haskell for Great Good steht und deren Fragen ohne viel Aufhebens beantwortet werden.Antworten:
Dies wird als "Empfänger" bezeichnet. Im ersten Fall handelt
(h handler)
es sich um einen Werttyp, im zweiten(s *GracefulServer)
um einen Zeiger. Die Funktionsweise in Go kann sich geringfügig von einigen anderen Sprachen unterscheiden. Der empfangende Typ funktioniert jedoch in den meisten objektorientierten Programmen mehr oder weniger wie eine Klasse. Es ist die Sache, von der aus Sie die Methode aufrufen, ähnlich wie wenn ich eine MethodeA
neben eine Klasse stelle,Person
dann würde ich eine Instanz vom Typ benötigen,Person
um sie aufzurufenA
(vorausgesetzt, es ist eine Instanzmethode und keine statische!).Ein Problem hierbei ist, dass der Empfänger wie andere Argumente auf den Aufrufstapel geschoben wird. Wenn der Empfänger also ein Werttyp ist, wie im Fall von
handler
, arbeiten Sie an einer Kopie des Dings, das Sie als Methode bezeichnet haben, aus einer Bedeutung wie "h.Name = "Evan"
würde" nicht bestehen bleiben, nachdem Sie zum aufrufenden Bereich zurückgekehrt sind. Aus diesem Grund muss alles, was erwartet, den Status des Empfängers zu ändern, einen Zeiger verwenden oder den geänderten Wert zurückgeben (gibt eher ein unveränderliches Typ-Paradigma, wenn Sie danach suchen).Hier ist der relevante Abschnitt aus der Spezifikation; https://golang.org/ref/spec#Method_sets
quelle
Dies bedeutet, dass
ServeHTTP
es sich nicht um eine eigenständige Funktion handelt. Die Klammer vor dem Funktionsnamen ist die Go-Methode zum Definieren des Objekts, mit dem diese Funktionen ausgeführt werden. Es handelt sich also im WesentlichenServeHTTP
um eine Methode des Typhandlers, die mit einem beliebigen Objekt, z. B. h, des Typhandlers aufgerufen werden kann.Sie werden auch Empfänger genannt. Es gibt zwei Möglichkeiten, sie zu definieren. Wenn Sie den Empfänger ändern möchten, verwenden Sie einen Zeiger wie:
Wenn Sie den Empfänger nicht ändern müssen, können Sie den Empfänger wie folgt definieren:
Dieses Beispiel vom Go-Spielplatz zeigt das Konzept.
Die Ausgabe des obigen Programms ist:
quelle