Maison >développement back-end >Golang >Pourquoi les alias de type dans Go se comportent-ils différemment lorsqu'ils héritent de types intégrés ?
Plonger dans les complexités de l'alias de type
Considérez l'extrait de code suivant :
package main import ( "fmt" "time" ) type dur struct { time.Duration } type durWithMethods dur type durWithoutMethods time.Duration func main() { var d durWithMethods // works ?? fmt.Println(d.String()) var dWM durWithoutMethods fmt.Println(dWM.String()) // doesn't compile }
On pourrait se demander pourquoi le direct alias de time.Duration (durWithoutMethods) n'hérite d'aucune méthode, tandis que le type imbriqué l'alias (durWithMethods) leur accorde l'accès. Cette confusion provient d'une différence fondamentale entre les définitions de type et les alias de type.
Définir de nouveaux types ou renommer ceux existants
Dans Go, les déclarations de type se répartissent en deux catégories : définitions de types et alias de types. Les définitions de types donnent naissance à de nouveaux types en intégrant un ou plusieurs types existants. Ils héritent des méthodes uniquement des types intégrés de niveau supérieur, et non des types imbriqués.
Les alias de types, en revanche, sont de simples raccourcis qui lient les nouveaux identifiants aux types existants. Ils ne créent pas de nouveaux types, le type sous-jacent reste donc inchangé. Toutes les méthodes associées au type sous-jacent seront toujours facilement accessibles via le nom d'origine ou l'alias.
Comprendre durWithMethods
Le type durWithMethods étend efficacement le type dur de en l'intégrant. Puisque dur intègre time.Duration, il hérite des méthodes de Duration, y compris String(). Par conséquent, d.String() dans le code fonctionne comme prévu.
Dévoilement de durWithoutMethods
Contrairement à durWithMethods, durWithoutMethods est un alias direct de time.Duration. Il n'étend rien, il se compose donc uniquement du type primitif time.Duration. Les méthodes de time.Duration ne sont pas transférées à durWithoutMethods car il s'agit d'un type distinct avec son propre ensemble de méthodes. Par conséquent, dWM.String() ne compilera pas.
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!