为何不同

为何不同

问题描述:

在Golang规格:为何不同

type (
    T0 []string 
    T1 []string 
) 

它说T0和T1是不同的,因为它们具有独特的命名类型declarations.but有个规则:如果他们的类型 两个命名的类型是相同的名称来源于相同的TypeSpec。 那么为什么T0和T1是不同的?


编辑:

在规格

它也说:

类型声明结合的标识符,类型名,一种新型 具有相同的基本类型作为现有类型和为现有类型定义的操作 也针对新类型定义。 新类型与现有类型不同。

+0

@JimB:“'如果两个切片类型具有相同的元素类型,则它们是相同的。”对于定义的类型不适用:[类型标识](https://golang.org/ref/spec#Type_identity)。 '定义类型总是与其他类型不同。' – peterSO

+1

@shx:The Go Programming Language Specification的当前版本位于https://golang.org/ref/spec。你从哪里得到你的报价? – peterSO

+0

@peterSO,是的,并不意味着它只是一个答案,只是试图找出引用来自哪里,为什么这是一个问题。 – JimB

考虑:

type (
    T0 []string 
    T1 []string 
) 

转到编程语言6月28日的规格

版,2017年

类型定义创建了一个新的,不同的类型,具有相同 基础类型和操作作为给定类型,并将 标识符绑定到它。

TypeDef = identifier Type . 

新类型被称为定义类型。它与任何其他 类型不同,包括它的创建类型。

定义的类型总是与其他类型不同。否则,两个 类型是相同的,如果它们的基础类型文字在结构上相当于 ;也就是说,它们具有相同的字面结构,并且相应的组件具有相同的类型。

T0和T1是定义的类型,因此是不同的。


参考文献:

6月28日的

The Go Programming Language Specification

版,2017

Types

A型确定一组值与操作和方法一起特定于这些值。类型可以用类型名称表示,如果它有 有一个类型,或者使用类型字面量来指定,该类型文字组成 现有类型的类型。

预定义的布尔型,数值型和字符串类型的命名实例为 。其他命名类型引入了类型声明。

Type declarations

类型声明结合的标识符,类型名,一个类型。类型 声明有两种形式:别名声明和类型 定义。

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

别名声明

别名声明结合的标识符设置为给定类型。

AliasDecl = identifier "=" Type . 

在所述标识符的范围内,它用作用于 类型的别名。

类型定义

类型定义创建一个新的,不同的类型,具有相同 基础类型和操作给定的类型,并结合一个 标识符给它。

TypeDef = identifier Type . 

新类型被称为定义类型。它与任何其他 类型不同,包括它的创建类型。

Type identity

两种类型相同或不同。

定义的类型总是与其他类型不同。否则,两个 类型是相同的,如果它们的基础类型文字在结构上相当于 ;也就是说,它们具有相同的字面结构,并且相应的组件具有相同的类型。