【问题标题】:why they are different为什么他们不同
【发布时间】:2018-03-28 15:00:27
【问题描述】:

在 Golang 规范中:

type (
    T0 []string
    T1 []string
)

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


编辑:

在规范中它还说:

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

【问题讨论】:

  • @JimB:“Two slice types are identical if they have identical element types。”不适用于已定义类型:Type identityA defined type is always different from any other type.
  • @shx:Go 编程语言规范的当前版本位于golang.org/ref/spec。你从哪里得到你的报价?
  • @peterSO,是的,这并不是一个答案,只是想弄清楚这句话最初来自哪里以及为什么这是一个问题。

标签: go types


【解决方案1】:

给定:

type (
    T0 []string
    T1 []string
)

Go 编程语言规范

2017 年 6 月 28 日版本

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

TypeDef = identifier 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 identity

两种类型要么相同,要么不同。

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

【讨论】:

    猜你喜欢
    • 2012-07-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2011-07-04
    • 2021-11-25
    • 2016-02-12
    • 2011-12-18
    相关资源
    最近更新 更多