Expresiones de método
En Go, un método puede usarse como función. La diferencia está en cuándo se elige el receptor (el valor sobre el que se llama al método).
| |
Method expression
(*Greeting).Say toma el método del tipo, sin asociarlo todavía a una persona concreta. Su tipo es func(*Greeting) string; el receptor se pasa como primer argumento:
| |
La misma función sirve para ambas personas porque recibe el receptor en cada llamada.
Con yield
Una expresión de método resulta especialmente útil cuando una función recorre una colección y entrega cada elemento a una función yield:
| |
La primera llamada usa una función anónima. La segunda pasa (*Greeting).Say directamente. Ambas hacen lo mismo porque (*Greeting).Say tiene el tipo func(*Greeting), que coincide con el tipo esperado por yield.
SayAll decide qué persona pasa al callback en cada iteración. Por eso necesita una method expression, que recibe el receptor como argumento; person.Say no serviría porque ya quedaría asociada a una persona concreta.
La salida es:
| |
Method value
ana.Say toma el método de una instancia. Su tipo es func() string porque el receptor ya está asociado:
| |
Regla rápida: (*Greeting).Say recibe el receptor al llamarse; ana.Say ya sabe qué receptor usar. La expresión de método resulta útil cuando quieres aplicar la misma operación a distintas instancias.