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 ?

Pourquoi les alias de type dans Go se comportent-ils différemment lorsqu'ils héritent de types intégrés ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-22 11:56:12619parcourir

Why Do Type Aliases in Go Behave Differently When They Inherit from Embedded Types?

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!

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