Maison >développement back-end >Golang >Pourquoi les valeurs non adressables dans les interfaces Golang ne sont-elles pas accessibles par adresse ?
Le concept de valeurs non adressables dans les interfaces Go, largement discuté dans la documentation Golang et les forums communautaires, soulève la question : pourquoi ces valeurs ne sont-elles pas accessibles via leur adresse ?
Au fur et à mesure Le wiki sur MethodSets (https://github.com/golang/go/wiki/MethodSets#interfaces) souligne : « La valeur concrète stockée dans une interface n'est pas adressable, de la même manière qu'un élément de carte n'est pas adressable. " La non-adressabilité des éléments de la carte est bien comprise et expliquée en détail dans l'article complémentaire "Pourquoi les valeurs de la carte ne sont-elles pas adressables ?".
Cependant , la raison sous-jacente de la non-adressabilité des valeurs dans les interfaces n'est pas aussi claire. Pourquoi la conception du langage impose-t-elle cette restriction ?
La réponse réside dans la préservation de l’intégrité des types. Un pointeur vers une valeur d'un type spécifique, lorsqu'il est affecté à une interface, doit pointer vers une valeur de ce type. Cependant, si l'interface pouvait contenir des valeurs de types différents, le pointeur deviendrait invalide chaque fois qu'une valeur d'un type différent était attribuée à l'interface.
Pour illustrer, considérons une interface I et deux types A et B qui implémenter I :
type I interface{} type A int type B string
Si nous stockons une valeur A dans I et prenons l'adresse de cette valeur, le pointeur résultant serait de taper *A. Cependant, si nous attribuons par la suite une valeur B à I, le pointeur deviendrait invalide.
La non-adressabilité des valeurs d'interface a des implications directes pour les méthodes avec pointeur récepteurs. De telles méthodes attendent un pointeur vers un type de béton spécifique. Puisqu'une valeur non-pointeur dans une interface n'est pas adressable, elle ne peut pas être transmise à une méthode avec un récepteur de pointeur, ce qui entraîne l'erreur :
<type> does not implement <interface> (<name> method has pointer receiver)
En résumé, le La raison de la non-adressabilité des valeurs dans les interfaces Go est de protéger l'intégrité du type. Un pointeur vers une valeur d'un type spécifique doit toujours pointer vers une valeur de ce type, ce qui ne peut pas être garanti si la valeur est stockée dans une interface pouvant contenir des valeurs de différents types.
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!