una todas tipos retorno llamar lenguaje las funciones funcion ejemplos con como go

go - todas - Sintaxis de declaración de función: cosas entre paréntesis antes del nombre de la función



tipos de funciones en lenguaje c (2)

Esto se llama el "receptor". En el primer caso (h handler) es un tipo de valor, en el segundo (s *GracefulServer) es un puntero. La forma en que esto funciona en Go puede variar un poco de algunos otros idiomas. Sin embargo, el tipo de recepción funciona más o menos como una clase en la mayoría de la programación orientada a objetos. Es de la forma en que llama al método, al igual que si coloco algún método A junto a una clase Person , necesitaría una instancia de tipo Person para llamar a A (¡suponiendo que sea un método de instancia y no estático!).

Un problema aquí es que el receptor es empujado a la pila de llamadas como otros argumentos, por lo que si el receptor es un tipo de valor, como en el caso del handler , estará trabajando en una copia de lo que llamó el método, lo que significa algo como h.Name = "Evan" no persistirá después de que regrese al alcance de la llamada. Por esta razón, cualquier cosa que espere cambiar el estado del receptor, necesita usar un puntero o devolver el valor modificado (da más de un paradigma de tipo inmutable si lo está buscando).

Aquí está la sección relevante de la especificación; https://golang.org/ref/spec#Method_sets

Lo siento, no podría ser más específico en el título de la pregunta, pero estaba leyendo un código Go y encontré declaraciones de función de esta forma:

func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { ... }

de https://github.com/mattermost/platform/blob/master/api/context.go

func (s *GracefulServer) BlockingClose() bool { ... }

de https://github.com/braintree/manners/blob/master/server.go

¿Qué significa el (h handler) y el (s *GracefulServer) entre paréntesis? ¿Qué significa toda la declaración de función, teniendo en cuenta el significado de las cosas entre paréntesis?

Editar

Este no es un duplicado de ¿ Cuál es la diferencia de funciones y métodos en Go? : esta pregunta se me ocurrió porque no sabía cuáles eran las cosas entre paréntesis antes del nombre de la función, no porque me preguntara cuál era la diferencia entre funciones y métodos ... si supiera que esta declaración es un método, no lo haría He tenido esta pregunta en primer lugar. Si alguien tiene la misma duda que yo algún día, no creo que vaya a buscar "métodos de golang" porque no sabe que ese es el caso. Sería como preguntarse qué significa la letra "sigma" antes de una expresión matemática (sin saber que significa sumatoria) y alguien dice que es un duplicado de cuál es la diferencia entre la sumatoria y alguna otra cosa.

Además, la respuesta corta a esta pregunta ("es un receptor") no es una respuesta a "cuál es la diferencia entre funciones y métodos".


Significa que ServeHTTP no es una función independiente. El paréntesis antes del nombre de la función es la forma Go de definir el objeto en el que operarán estas funciones. Entonces, esencialmente ServeHTTP es un método de manejador de tipos y se puede invocar usando cualquier objeto, digamos h, del manejador de tipos.

h.ServeHTTP(w, r)

También se les llama receptores. There dos formas de definirlos. Si desea modificar el receptor, use un puntero como:

func (s *MyStruct) pointerMethod() { } // method on pointer

Si no necesita modificar el receptor, puede definirlo como un valor como:

func (s MyStruct) valueMethod() { } // method on value

This ejemplo de Go playground demuestra el concepto.

package main import "fmt" type Mutatable struct { a int b int } func (m Mutatable) StayTheSame() { m.a = 5 m.b = 7 } func (m *Mutatable) Mutate() { m.a = 5 m.b = 7 } func main() { m := &Mutatable{0, 0} fmt.Println(m) m.StayTheSame() fmt.Println(m) m.Mutate() fmt.Println(m)

La salida del programa anterior es:

&{0 0} &{0 0} &{5 7}