2017-10-17 4 views
-4

In Golang spec:warum sie anders sind

type (
    T0 []string 
    T1 []string 
) 

es sagt T0 und T1 verschieden sind, weil sie Arten mit unterschiedlichen Namen sind declarations.but es eine Regel gibt: Zwei genannten Typen identisch sind, wenn ihre Art Namen stammen aus derselben TypeSpec. Also warum T0 und T1 sind unterschiedlich?


EDIT:

in spec es sagt auch:

Eine Typdeklaration eine Kennung bindet, den Typnamen, einen neuen Typ , die den gleichen zugrunde liegenden Typ als vorhandenes hat type und die für den vorhandenen Typ definierten Operationen sind ebenfalls für den neuen Typ definiert. Der neue Typ unterscheidet sich vom vorhandenen Typ.

+0

@ JimB: "Zwei Slice-Typen sind identisch, wenn sie identische Elementtypen haben." Nicht zutreffend für definierte Typen: [Typidentität] (https://golang.org/ref/spec#Type_identity). 'Ein definierter Typ unterscheidet sich immer von einem anderen Typ.' – peterSO

+1

@shx: Die aktuelle Version der Go-Programmiersprachenspezifikation finden Sie unter https://golang.org/ref/spec. Woher bekommst du deine Zitate? – peterSO

+0

@peterSO, ja, meinte es nicht als Antwort, nur um herauszufinden, woher dieses Zitat überhaupt kam und warum das überhaupt eine Frage ist. – JimB

Antwort

1

Gegeben:

type (
    T0 []string 
    T1 []string 
) 

The Go Programming Language Specification

Version von 28. Juni 2017

Eine Typdefinition erstellt eine neue, unterschiedliche Art mit dem gleichen zugrunde liegenden Typ und Operationen als den angegebenen Typ und bindet eine Kennung an es.

TypeDef = identifier Type . 

Der neue Typ wird eine definierte Art genannt. Es unterscheidet sich von jedem anderen Typ , einschließlich des Typs, aus dem es erstellt wird.

Ein definierter Typ unterscheidet sich immer von einem anderen Typ. Ansonsten sind zwei Typen identisch, wenn ihre zugrundeliegenden Literale strukturell äquivalent sind; das heißt, sie haben die gleiche wörtliche Struktur und entsprechende Komponenten haben identische Typen.

T0 und T1 sind definierte Typen und unterscheiden sich daher.


Referenzen:

The Go Programming Language Specification

Version vom 28. Juni 2017

Types

bestimmt eine Art, die einen Satz von Werten zusammen mit Operationen und Verfahren spezifisch für diese Werte. Ein Typ kann durch einen Typnamen angegeben werden, wenn er einen Wert aufweist oder mit einem Typliteral angegeben wird, das einen Typ aus vorhandenen Typen zusammensetzt.

Benannte Instanzen der booleschen, numerischen und Zeichenfolgetypen sind vordeklariert. Andere benannte Typen werden mit Typdeklarationen eingeführt.

Type declarations

A Typdeklaration bindet eine Kennung, die Typenbezeichnung, auf einen Typ. Geben Sie Deklarationen in zwei Formen: Alias-Deklarationen und Typ Definitionen.

TypeDecl = "type" (TypeSpec | "(" { TypeSpec ";" } ")") . 
TypeSpec = AliasDecl | TypeDef . 

Alias ​​Erklärungen

Ein Alias ​​Erklärung bindet eine Kennung an den gegebenen Typ.

AliasDecl = identifier "=" Type . 

Im Rahmen des Identifizierers, dient es als ein Alias ​​für den Typ .

Typdefinitionen

Eine Typdefinition erstellt eine neue, unterschiedliche Art mit dem gleichen zugrunde liegenden Typ und Operationen wie die Art gegeben, und binden eine Kennung zu.

TypeDef = identifier Type . 

Der neue Typ wird eine definierte Art genannt. Es unterscheidet sich von jedem anderen Typ , einschließlich des Typs, aus dem es erstellt wird.

Type identity

Zwei Typen sind entweder gleich oder verschieden sind.

Ein definierter Typ unterscheidet sich immer von einem anderen Typ. Ansonsten sind zwei Typen identisch, wenn ihre zugrundeliegenden Literale strukturell äquivalent sind; das heißt, sie haben die gleiche wörtliche Struktur und entsprechende Komponenten haben identische Typen.

Verwandte Themen