Comprendre les alias de type dans Go
Dans Go, les alias de type peuvent prêter à confusion. Le code suivant illustre ceci :
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 }
Pourquoi l'alias direct durWithoutMethods n'hérite-t-il d'aucune méthode, contrairement à durWithMethods ?
Déclarations de type et alias
Pour comprendre cela, nous devons faire la différence entre les déclarations de type et les alias de type. Une déclaration de type crée un nouveau type, supprimant toutes les méthodes de son type sous-jacent. Un alias de type, en revanche, lie simplement un nouvel identifiant à un type existant.
Résolution de la méthode
Dans le cas de durWithMethods, un nouveau type durWithMethods est créé avec dur comme type sous-jacent. Comme dur intègre time.Duration, les méthodes de time.Duration sont promues à dur. Par conséquent, d.String() peut être appelé en utilisant le raccourci d.Duration.String().
Stripping of Methods
Cependant, dans durWithoutMethods, l'alias direct de time.Duration, toutes les méthodes sont supprimées. Puisque Duration.String() est une méthode de time.Duration, elle n'est pas héritée par durWithoutMethods.
True Type Aliases
Un vrai alias de type, d'autre part main, est désigné par le signe = :
type sameAsDuration = time.Duration
Cela crée un alias pour le temps.Durée sans méthodes de décapage. Par conséquent, sad.String() peut être appelé de la même manière que d.String().
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!