为什么他们不同

时间:2017-10-17 01:49:58

标签: go types

在Golang规范中:

type (
    T0 []string
    T1 []string
)

它说T0和T1是不同的,因为它们是具有不同声明的命名类型。但是有一个规则: 如果两个命名类型的类型名称来自同一个TypeSpec,则它们是相同的。 为什么T0和T1不同?

编辑:

在规范中它也说:

  

类型声明将标识符(类型名称)绑定到新类型   与现有类型和操作具有相同的基础类型   为现有类型定义的也是为新类型定义的。的的   新类型与现有类型不同。

1 个答案:

答案 0 :(得分:1)

假设:

type (
    T0 []string
    T1 []string
)
  

Go编程语言规范

     

2017年6月28日的版本

     

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

TypeDef = identifier Type .
     

新类型称为已定义类型。它与众不同   type,包括从中创建的类型。

     

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

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

<强>参考文献:

  

The Go Programming Language Specification

     

2017年6月28日的版本

     

Types

     

类型确定一组值以及操作和方法   具体到那些价值观。如果类型名称可以用类型名称表示   有一个,或使用类型文字指定,它组成一个类型   现有的类型。

     

布尔值,数字和字符串类型的命名实例   预声明。其他命名类型与类型声明一起引入。

     

Type declarations

     

类型声明将标识符(类型名称)绑定到类型。类型   声明有两种形式:别名声明和类型   定义

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

别名声明

     

别名声明将标识符绑定到给定类型。

AliasDecl = identifier "=" Type .
     

在标识符的范围内,它充当了标识符的别名   类型。

     

类型定义

     

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

TypeDef = identifier Type .
     

新类型称为已定义类型。它与众不同   type,包括从中创建的类型。

     

Type identity

     

两种类型相同或不同。

     

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