Sinto muito, mas não pude ser mais específico no título da pergunta, mas estava lendo algum código Go e encontrei declarações de função deste formulário:
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
...
}
em https://github.com/mattermost/platform/blob/master/api/context.go
func (s *GracefulServer) BlockingClose() bool {
...
}
em https://github.com/braintree/manners/blob/master/server.go
O que significa o parêntese (h handler)
e (s *GracefulServer)
entre? O que significa toda a declaração de função, levando em consideração o significado das coisas entre parênteses?
Editar
Esta não é uma duplicata de Qual a diferença de funções e métodos no Go? : essa pergunta veio a mim porque eu não sabia o que estavam entre parênteses antes do nome da função, não porque me perguntava qual era a diferença entre funções e métodos ... se soubesse que essa declaração era um método, não saberia ' Não tive essa pergunta em primeiro lugar. Se alguém tiver a mesma dúvida que eu um dia, não acredito que ela vá procurar "métodos golang" porque não sabe que esse é o caso. Seria como imaginar o que a letra "sigma" significa antes de uma expressão matemática (não saber que significa soma) e alguém diz que é uma duplicata da diferença entre soma e alguma outra coisa.
Além disso, a resposta curta a essa pergunta ("é um receptor") não é resposta para "qual é a diferença entre funções e métodos".
n
elemento da lista em Haskell? , que está na Introdução sobre o aprendizado de um Haskell para um bom bem, e obtém respostas para suas perguntas sem se preocupar com isso.Respostas:
Isso é chamado de 'receptor'. No primeiro caso
(h handler)
, é um tipo de valor, no segundo(s *GracefulServer)
, é um ponteiro. A maneira como isso funciona no Go pode variar um pouco em relação a outros idiomas. O tipo de recebimento, no entanto, funciona mais ou menos como uma classe na maioria das programações orientadas a objetos. É o que você chama de método, assim como se eu colocasse algum métodoA
de lado em alguma classePerson
, eu precisaria de uma instância do tipoPerson
para chamarA
(assumindo que seja um método de instância e não estático!).Uma pegadinha aqui é que o receptor é empurrado para a pilha de chamadas como outros argumentos por isso, se o receptor é um tipo de valor, como no caso de
handler
, em seguida, você estará trabalhando em uma cópia da coisa que você chamou o método de significar algo comoh.Name = "Evan"
Would não persistirá depois que você retornar ao escopo da chamada. Por esse motivo, qualquer coisa que espere alterar o estado do receptor, precisa usar um ponteiro ou retornar o valor modificado (fornece um paradigma de tipo imutável, se você estiver procurando por isso).Aqui está a seção relevante da especificação; https://golang.org/ref/spec#Method_sets
fonte
Isso significa que
ServeHTTP
não é uma função autônoma. O parêntese antes do nome da função é a maneira correta de definir o objeto no qual essas funções irão operar. Portanto, essencialmenteServeHTTP
é um método do manipulador de tipos e pode ser chamado usando qualquer objeto, digamos h, do manipulador de tipos.Eles também são chamados de receptores. Existem duas maneiras de defini-las. Se você deseja modificar o receptor, use um ponteiro como:
Se você não precisar modificar o receptor, poderá defini-lo como um valor como:
Este exemplo do playground Go demonstra o conceito.
A saída do programa acima é:
fonte