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 su lugar, a menudo terminan con er, por ejemplo, Reader o Stringer.
Cualquier tipo que defina los métodos de la interfaz la implementa de forma automática e implícita.
No existe la palabra clave implements en Go.
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 de puntero. (Vuelve a consultar los conceptos de métodos si tienes dudas al respecto.)
Un valor de tipo interfaz puede contener cualquier valor que implemente esos métodos. [^1]
Eso significa que Stats ahora se puede usar 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 fácilmente. Solo necesita tener definidos todos los métodos necesarios.
Hay un tipo de interfaz muy especial en Go, el tipo 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 se usa con más frecuencia.
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 utiliza el tipo interfaz vacía.
El nuevo aeropuerto de Berlín ha contratado a desarrolladores para su laboratorio de robótica y tú empiezas a trabajar allí. Tienen unos robots torpes y con un aspecto un tanto humanoide que intentan 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 hayan escaneado su pasaporte en el mostrador de facturación automática.
El robot está orgulloso de sus habilidades, así que siempre dirá primero en 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 tienes que estructurar el código del robot de forma que otros desarrolladores puedan añadir más idiomas fácilmente.
Como primer paso, define una interfaz Greeter con dos métodos.
LanguageName, que devuelve el nombre del idioma (un string) en el que el robot debe saludar al visitante.Greet, que acepta el nombre de un visitante (un string) y devuelve un string con el mensaje de saludo en un idioma concreto.A continuación, 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 con el saludo deseado.
Por ejemplo, imagina una implementación alemana de Greeter para la que LanguageName devuelve "German" y Greet devuelve "Hallo {name}!":
SayHello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
Ahora tu tarea es hacer que el robot funcione para las personas que escaneen pasaportes italianos.
Para ello, crea una estructura Italian e implementa los dos métodos necesarios para que la estructura cumpla la interfaz Greeter que definiste en la tarea 1.
Puedes saludar a alguien en italiano con "Ciao {name}!".
Antes de dar el día por terminado, también tienes que completar la funcionalidad para saludar a las personas en portugués.
Para ello, crea una estructura Portuguese e implementa también aquí los dos métodos necesarios para que la estructura cumpla 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.