Sens d'une struct avec embedded anonyme interface?
sort
package:
type Interface interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}
...
type reverse struct {
Interface
}
Quel est le sens de l'anonymat de l'interface Interface
struct reverse
?
- Pour les chercheurs, il y a une explication beaucoup plus simple ici: Regarder de plus près Golang à Partir de la Perspective d'un Architecte. Ne laissez pas le titre de l'article vous effrayer. 🙂
- AIUI, que l'article ("Regarder de plus près...") ne fait pas parler de ce que cela signifie d'intégrer anonyme interfaces dans une structure, c'est juste parle d'interfaces en général.
Vous devez vous connecter pour publier un commentaire.
De cette manière inverse implémente l'
sort.Interface
et nous pouvons surcharger une méthode spécifiquesans avoir à définir tous les autres
Avis comment ici, il swaps
(j,i)
au lieu de(i,j)
et aussi c'est la seule méthode déclarée pour la structreverse
même sireverse
mettre en œuvresort.Interface
Quelle que soit la structure est passée à l'intérieur de cette méthode, nous convertir à une nouvelle
reverse
struct.La valeur réelle vient, si vous pensez à ce que vous avez à faire si cette approche n'a pas été possible.
Reverse
méthode à lasort.Interface
?Tout de ce changement devrait être beaucoup beaucoup plus de lignes de code à travers des milliers de paquets qui veulent utiliser le standard inverse de la fonctionnalité.
reverse
a un membre de typeInterface
. Ce membre a ses méthodes appelables sur l'extérieur, struct ou remplacable.extend
pour l'extension de la non-abstraite sous-classes? Pour moi, ce peut être un moyen pratique pour remplacer seulement certaines méthodes tout en utilisant les installations existantes qui sont mis en œuvre en interneInterface
.Ok, accepté la réponse m'a aidé à comprendre, mais j'ai décidé de poster une explication qui, je pense, convient mieux à ma façon de penser.
La "Efficace Go" a l'exemple des interfaces intégrées à d'autres interfaces:
et une structure ayant incorporé d'autres structures:
Mais il n'est fait mention d'une structure ayant intégré une interface. J'étais confus de voir cela dans
sort
package:Mais l'idée est simple. C'est presque la même chose que:
méthodes de
IntSlice
d'être promureverse
.Et ce:
signifie que
sort.reverse
peut intégrer n'importe quel struct qui implémente l'interfacesort.Interface
et quelles que soient les méthodes de l'interface, ils seront promus àreverse
.sort.Interface
a la méthodeLess(i, j int) bool
qui peut maintenant être remplacée:Ma confusion dans la compréhension de
est que je pensais qu'une struct a toujours une structure fixe, c'est à dire le nombre fixe de champs fixes.
Mais la suite prouve que j'ai tort:
La déclaration
vous permet d'initialiser
reverse
avec tout ce qui implémente l'interfaceInterface
. Exemple:De cette façon, toutes les méthodes mises en œuvre par l'embedded
Interface
valeur remplis à l'extérieur pendant que vous êtes encore en mesure de remplacer certains d'entre eux dansreverse
, par exempleLess
à inverser l'ordre du tri.C'est ce qui se passe réellement lorsque vous utilisez
trier.Inverse
. Vous pouvez lire au sujet de l'incorporation de dans la structure de la section de la spécification.Je vais donner mon explication trop. Le
sort
package définit un désexporter typereverse
, qui est une structure, qui intègreInterface
.Ceci permet à l'Inverse de l'utilisation des méthodes d'un autre implémentation de l'Interface. C'est le
composition
, qui est une fonctionnalité puissante de Go.La
Less
méthode pourreverse
appelle laLess
méthode de l'embeddedInterface
valeur, mais avec les indices retourner, inverser l'ordre de tri des résultats.Len
etSwap
les deux autres méthodes dereverse
, sont fournies de manière implicite par l'originalInterface
valeur, car il est encastré un champ. Le exportéReverse
fonction retourne une instance de lareverse
type qui contient l'originalInterface
valeur.