#code #go

En Go, les interfaces permettent de définir des actions possibles sur un type. Par exemple :

type Greeter interface {
  fun Greet()
}

Tout type qui implémente Greet() sera automatiquement un Greeter, sans avoir à le préciser dans le code.

Concrete et interface type

Il y a une différence en Go entre - un “concrete type”, qui est un type qui peut être instancié et qui contient une valeur - un “interface type” qui est un type abstrait qui ne peut donc pas être instancié directement

Conversion et assertion

Il est possible de convertir un type vers un autre avec la syntaxe: MyType(value).

Il est également possible de faire un “type assertion” avec v, ok := value.(MyType), ou encore un “type switch” avec

switch v := value.(type) {
case TypeA:
  (...)
case TypeB:
  (...)
}

Empty interface

Un cas spécial est l’“empty interface” interface{} (aka any). Elle est implémentée par tous les types (par définition). L’empty interface est une sorte de “value box”, permettant d’accepter n’importe quel type, mais cela demande par la suite de faire des toute assertion ou de faire des toute switches pour utiliser la variable.