Warum verhalten sich Typaliase in Go anders, wenn sie von eingebetteten Typen erben?

Susan Sarandon
Freigeben: 2024-11-22 11:56:12
Original
505 Leute haben es durchsucht

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

Eintauchen in Typ-Aliasing-Komplexitäten

Betrachten Sie den folgenden Codeausschnitt:

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
}
Nach dem Login kopieren

Man könnte darüber nachdenken, warum das direkt Alias ​​von time.Duration (durWithoutMethods) erbt keine Methoden, während die verschachtelten Der Typalias (durWithMethods) gewährt Zugriff darauf. Diese Verwirrung rührt von einem grundlegenden Unterschied zwischen Typdefinitionen und Typaliasen her.

Neue Typen definieren oder bestehende umbenennen

In Go lassen sich Typdeklarationen in zwei Kategorien einteilen: Typdefinitionen und Typaliase. Typdefinitionen bringen neue Typen hervor, indem sie einen oder mehrere vorhandene Typen einbetten. Sie erben Methoden nur von den eingebetteten Typen der obersten Ebene, nicht von verschachtelten Typen.

Typaliase hingegen sind bloße Abkürzungen, die neue Bezeichner an vorhandene Typen binden. Sie erstellen keine neuen Typen, sodass der zugrunde liegende Typ unverändert bleibt. Alle mit dem zugrunde liegenden Typ verknüpften Methoden sind weiterhin über den ursprünglichen Namen oder den Alias ​​leicht zugänglich.

DurWithMethods verstehen

Der Typ durWithMethods erweitert den Typ dur effektiv um es einbetten. Da dur time.Duration einbettet, erbt es die Methoden von Duration, einschließlich String(). Daher funktioniert d.String() im Code wie erwartet.

Enthüllung von durWithoutMethods

Im Gegensatz zu durWithMethods ist durWithoutMethods ein direkter Alias ​​von time.Duration. Es erweitert nichts und besteht daher ausschließlich aus dem primitiven Typ time.Duration. Methoden von time.Duration werden nicht an durWithoutMethods übertragen, da es sich um einen eigenständigen Typ mit einem eigenen Methodensatz handelt. Daher wird dWM.String() nicht kompiliert.

Das obige ist der detaillierte Inhalt vonWarum verhalten sich Typaliase in Go anders, wenn sie von eingebetteten Typen erben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage