Przepraszam, że nie mogłem sprecyzować tytułu pytania, ale czytałem trochę kodu Go i napotkałem deklaracje funkcji tego formularza:
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
...
}
z https://github.com/mattermost/platform/blob/master/api/context.go
func (s *GracefulServer) BlockingClose() bool {
...
}
od https://github.com/braintree/manners/blob/master/server.go
Co oznacza nawias (h handler)
i (s *GracefulServer)
pomiędzy nimi? Co oznacza cała deklaracja funkcji, biorąc pod uwagę znaczenie rzeczy między nawiasami?
Edytować
To nie jest duplikat Jaka jest różnica funkcji i metod w Go? : to pytanie przyszło mi do głowy, ponieważ nie wiedziałem, co to są w nawiasach przed nazwą funkcji, a nie dlatego, że zastanawiałem się, jaka jest różnica między funkcjami i metodami ... gdybym wiedział, że ta deklaracja jest metodą, której nie zrobiłbym po pierwsze miałem to pytanie. Jeśli pewnego dnia ktoś ma takie same wątpliwości jak ja, nie sądzę, by poszła szukać „metod golang”, ponieważ nie wie, że tak jest. To tak, jakby zastanawiać się, co oznacza litera „sigma” przed wyrażeniem matematycznym (nie wiedzieć, że oznacza to sumowanie), a ktoś mówi, że jest duplikatem różnicy między sumowaniem a czymś innym.
Krótka odpowiedź na to pytanie („to odbiornik”) nie jest odpowiedzią na „jaka jest różnica między funkcjami a metodami”.
n
element z listy w Haskell? , który znajduje się we wstępie „ Naucz się Haskella dla wielkiego dobra” i uzyskaj odpowiedź na ich pytania bez kłopotów z tym związanych.Odpowiedzi:
Nazywa się to „odbiornikiem”. W pierwszym przypadku
(h handler)
jest to typ wartości, w drugim(s *GracefulServer)
wskaźnik. Sposób działania w Go może się nieco różnić w zależności od niektórych innych języków. Jednak typ odbierający działa mniej więcej jak klasa w większości programowania obiektowego. Jest to rzecz, z której wywołujesz metodę, podobnie jak gdybym umieścił jakąś metodęA
na boku jakiejś klasy,Person
wtedy potrzebowałbym instancji typuPerson
w celu wywołaniaA
(zakładając, że jest to metoda instancji, a nie statyczna!).Jeden haczyka tutaj jest to, że odbiornik zostaje umieszczana na stosie połączeń, podobnie jak inne argumenty, więc jeśli odbiornik jest typ wartości, podobnie jak w przypadku
handler
wtedy będzie pracować na kopii rzeczą, którą nazywa się metodą z oznacza cośh.Name = "Evan"
BĘDZIE nie utrzymują się po powrocie do zakresu wywoływania. Z tego powodu wszystko, co oczekuje zmiany stanu odbiornika, musi użyć wskaźnika lub zwrócić zmodyfikowaną wartość (daje więcej niezmiennego paradygmatu typu, jeśli tego szukasz).Oto odpowiednia sekcja ze specyfikacji; https://golang.org/ref/spec#Method_sets
źródło
Oznacza
ServeHTTP
to, że nie jest samodzielną funkcją. Nawias przed nazwą funkcji to Go metoda definiowania obiektu, na którym te funkcje będą działać. ZasadniczoServeHTTP
jest to metoda obsługi typów i można ją wywoływać za pomocą dowolnego obiektu, powiedzmy h, z procedury obsługi typów.Są również nazywane odbiornikami. Istnieją dwa sposoby ich zdefiniowania. Jeśli chcesz zmodyfikować odbiornik, użyj wskaźnika takiego jak:
Jeśli nie musisz modyfikować odbiornika, możesz zdefiniować odbiornik jako wartość:
Ten przykład z placu zabaw Go demonstruje tę koncepcję.
Dane wyjściowe powyższego programu to:
źródło