En su forma más simple, un tipo de interfaz es un conjunto de firmas de métodos.
Aquí tienes un ejemplo de una definición de interfaz que incluye dos métodos, Add y Value:
type Counter interface {
Add(increment int)
Value() int
}
Los nombres de los parámetros como increment se pueden omitir de la definición de la interfaz, pero a menudo aumentan la legibilidad.
Los nombres de las interfaces en Go no contienen la palabra Interface ni I.
En cambio, a menudo terminan en er, por ejemplo Reader y Stringer.
Cualquier tipo que defina los métodos de la interfaz automáticamente «implementa» la interfaz de forma implícita.
En Go no existe la palabra clave implements.
El siguiente tipo implementa la interfaz Counter que vimos antes.
type Stats struct {
value int
// ...
}
func (s Stats) Add(v int) {
s.value += v
}
func (s Stats) Value() int {
return s.value
}
func (s Stats) SomeOtherMethod() {
// The type can have additional methods not mentioned in the interface.
}
Para implementar la interfaz, no importa si el método tiene un receptor de valor o un receptor de puntero. (Vuelve a revisar los conceptos de métodos si tienes dudas sobre esto.)
Un valor de tipo interfaz puede contener cualquier valor que implemente esos métodos. [^1]
Eso significa que ahora puedes usar Stats en todos los lugares que esperan la interfaz Counter.
func SetUpAnalytics(counter Counter) {
// ...
}
stats := Stats{}
SetUpAnalytics(stats)
// works because Stats implements Counter
Como las interfaces se implementan de forma implícita, un tipo puede implementar varias interfaces con facilidad. Solo necesita tener definidos todos los métodos necesarios.
En Go hay un tipo de interfaz muy especial: el tipo de interfaz vacía, que no contiene ningún método.
La interfaz vacía se escribe así: interface{}.
any es un alias de interface{} y es lo que más se usa.
Como la interfaz vacía no tiene métodos, todos los tipos la implementan de forma implícita. Esto es útil para definir una función que pueda aceptar cualquier valor de forma genérica. En ese caso, el parámetro de la función usa el tipo de interfaz vacía.
El nuevo aeropuerto de Berlín contrató a desarrolladores para su laboratorio de robots, y tú empiezas a trabajar allí. Tienen robots torpes, de aspecto un tanto humanoide, que están intentando usar para mejorar la atención al cliente.
Tu primera tarea en el trabajo es escribir un programa para que el robot pueda saludar a las personas en su idioma nativo después de que escaneen su pasaporte en el mostrador de auto check-in.
El robot está orgulloso de sus habilidades, así que siempre dirá primero qué idioma puede hablar y luego saludará a la persona. Por ejemplo, si alguien escanea un pasaporte alemán, el robot diría:
I can speak German: Hallo Dietrich!
No vas a escribir tú el código de los distintos idiomas, así que necesitas estructurar el código del robot de modo que otros desarrolladores puedan añadir más idiomas fácilmente después.
Como primer paso, define una interfaz Greeter con dos métodos.
LanguageName, que devuelve el nombre del idioma (un string) en el que se supone que el robot saluda al visitante.Greet, que acepta el nombre de un visitante (un string) y devuelve un string con el mensaje de saludo en un idioma específico.Luego, implementa una función SayHello que acepte como argumentos el nombre del visitante y cualquier cosa que implemente la interfaz Greeter, y que devuelva el string de saludo deseado.
Por ejemplo, imagina una implementación de Greeter en alemán para la cual LanguageName devuelve "German" y Greet devuelve "Hallo {name}!":
SayHello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
Ahora tu trabajo es hacer que el robot funcione para las personas que escanean pasaportes italianos.
Para eso, crea una estructura Italian e implementa los dos métodos que se necesitan para que la estructura cumpla con la interfaz Greeter que definiste en la tarea 1.
Puedes saludar a alguien en italiano con "Ciao {name}!".
Antes de terminar el día, también se supone que debes completar la funcionalidad para saludar a la gente en portugués.
Para eso, crea una estructura Portuguese e implementa aquí también los dos métodos que se necesitan para que la estructura cumpla con la interfaz Greeter.
Puedes saludar a alguien en portugués con "Olá {name}!".
Regístrate en Exercism para aprender y dominar Go con 34 conceptos166 ejercicios y mentoría humana real, todo gratis.