Maison  >  Article  >  développement back-end  >  transfert d'interface golang

transfert d'interface golang

WBOY
WBOYoriginal
2023-05-19 10:08:07459parcourir

Principe d'implémentation du type

Golang, en tant que langage typé statiquement, fournit une fonctionnalité très puissante : l'interface. Cela aide non seulement les développeurs à réaliser la réutilisabilité du code, mais nous permet également d'étendre les fonctionnalités du programme sans détruire la structure du code.

Dans Golang, une interface est un type, mais contrairement aux autres types, un type d'interface peut contenir un ensemble de déclarations de méthodes sans implémenter ces méthodes. Cela nous donne une grande flexibilité. En définissant un type d'interface, nous pouvons définir une méthode générale d'appel de méthode, et cette méthode d'appel est associée au type d'interface et n'a rien à voir avec le type d'implémentation.

Alors, lorsque nous utilisons un type d'interface, comment Golang le convertit-il en un type d'implémentation ? Avant de comprendre ce principe de mise en œuvre de base, comprenons d'abord les concepts de base des types et des types d'interface dans Golang.

Types et types d'interface dans Golang

Les types dans Golang peuvent être divisés en deux catégories : les types valeur et les types référence.

  • Type de valeur : type numérique, type booléen, type tableau, type structure, etc.
  • Types de référence : type de pointeur, type de tranche, type de carte, type de chan, etc.

Le type valeur signifie que la variable est stockée directement en mémoire, tandis que le type référence signifie que la variable stocke des pointeurs vers d'autres objets en mémoire. Pour les types valeur, ils peuvent être comparés directement, tandis que pour les types référence, la comparaison doit être effectuée à l'aide d'une fonction d'équivalence.

Dans Golang, nous pouvons utiliser des types d'interface pour représenter tous les types. L'interface est un type très flexible car elle peut représenter n'importe quel type de valeur de données. Une valeur d'interface peut stocker toutes les données qui implémentent la valeur de l'interface. Par conséquent, les types d’interface peuvent être utilisés pour transmettre des types de données arbitraires à des fonctions ou pour stocker des données d’objet sans connaître le type d’objet spécifique.

La relation entre les types et les types d'interface

En Golang, un type peut implémenter une ou plusieurs interfaces. Un type qui implémente toutes les méthodes d’une interface est considéré comme une instanciation de l’interface. Ce type peut être utilisé comme type de variable qui implémente cette interface.

Par exemple, nous avons un type d'interface appelé Shaper, qui a une méthode appelée Area() :

type Shaper interface {

Area() float64

}

Nous pouvons créer un type Square pour qu'il implémente l'interface Shaper Area() méthode :

type Square struct {

side float64

}

func (s *Square) Area() float64 {

return s.side * s.side

}

De cette façon, nous pouvons faire du type Square une instance du type Shaper. Si l'on veut calculer l'aire de type Square, on peut utiliser la méthode Area() de type Shaper pour obtenir la valeur d'aire :

func main() {

square := &Square{10.0}
fmt.Println("Area of square:", square.Area())

}

Ici, on peut voir que le type Square est implémenté par la méthode Area() de type Shaper, il peut donc être utilisé comme instance de type Shaper. Le type d'interface peut fournir ici une méthode Area() générale pour calculer différents types de zones, et l'implémentation de cette méthode Area() est déterminée par le type d'implémentation.

Pourquoi les assertions de type sont nécessaires ?

Maintenant que nous avons compris les bases des types et des types d'interface, voyons comment Golang convertit les types d'interface en types d'implémentation.

Lorsque l'on crée une variable de type interface, il s'agit en fait d'une structure de données contenant deux parties : un pointeur vers la table de méthodes (Method Table, également appelée table virtuelle ou Vtable) et un pointeur vers la valeur qui implémente le pointeur d'interface . La table des méthodes est une liste de tous les pointeurs de fonctions de méthode, chaque pointeur est associé à un nom de méthode et à un type.

Lorsque nous appelons une méthode d'un type d'interface, Golang vérifiera d'abord si la méthode est dans la table des méthodes, puis appellera la méthode correspondante. Habituellement, Golang utilise des récepteurs de pointeurs pour implémenter les types d'interface, car cette méthode est plus efficace que les récepteurs de valeur et empêche l'appelant de modifier les champs des types de valeur.

Mais parfois, lorsque nous utilisons un type d'interface, nous devons le convertir en type d'implémentation. Dans ce cas, nous devons utiliser des assertions de type. L'assertion de type est une opération qui détermine si la conversion de type est réalisable en jugeant si le type d'interface implémente le type cible. Si le jugement réussit, l'assertion de type renverra une valeur représentant le type cible, sinon elle renverra une valeur nulle et lèvera une exception. Par conséquent, avant de faire des assertions de type, nous devons utiliser la deuxième valeur de retour dans l’assertion de type pour émettre des jugements sûrs afin d’éviter les exceptions.

Le code suivant montre comment convertir un type d'interface en type d'implémentation :

func main() {

var shaper Shaper
square := &Square{10.0}
shaper = square                //将square类型转换成Shaper类型
s := shaper.(*Square)          //将shaper类型转换成Square类型
fmt.Println("Square side length:", s.side)

}

Ici, en attribuant une valeur de type Square à une variable de type Shaper, nous allons taper Square est converti en type Shaper. Lorsque nous devons le reconvertir, nous pouvons utiliser l'assertion de type pour convertir le type Shaper en type Square.

Résumé

Le type d'interface est un concept très important dans Golang, qui peut améliorer la réutilisabilité et l'évolutivité du code. Dans Golang, à l'aide des types d'interface et des assertions de type, nous pouvons convertir les types d'interface en types d'implémentation. Bien que les assertions de type apportent une plus grande flexibilité, vous devez faire attention à la sécurité de la conversion de type pendant l'utilisation pour éviter les exceptions.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn