命名和未命名类型

Jim*_*ard 9 types type-systems go

问题:

我最近开始阅读Golang 规范手册,并试图理解相关部分中命名和未命名类型.我来自一种动态的语言,这让我有点头疼.

手册说明:

类型确定特定于该类型值的值集和操作集.类型可以是命名的或未 命名的.命名类型由(可能合格的)类型名称指定 ; 使用类型文字指定未命名的类型,类型文字从现有类型组成新类型.

并继续:

预先声明了布尔,数字和字符串类型的命名实例.可以使用类型文字构造复合类型 - 数组,结构,指针,函数,接口,切片,映射和通道类型.

这里的问题是,随着规范的出现,这些链接让我跳到了页面上,并且忘记了那么多概念太快被我抛出的东西.


其他资源:

我已经四处寻找澄清,除了规范手册之外,资源很少.我能找到的唯一相关材料是:

不幸的是,我在Stack Overflow上找不到任何有关此问题的相关问题.(如果它们存在,我需要修改我的搜索方法!).我问,因为理解新语言的类型系统是有效学习它的基本概念之一.


那么,问题是:

有人可以提供一个简洁明了的例子,说明命名和未命名类型的概念之间的差异吗?*

*此外,解释合格预先声明的概念将有利于完整性,但显然没有必要.

Jam*_*dge 22

一种简单的思考方式是命名类型是您使用type语句定义的类型,未命名类型是由类型文字定义的复合类型.

例如,变量的类型x是未命名的:

var x struct{ I int }
Run Code Online (Sandbox Code Playgroud)

并且变量的类型y命名为:

type Foo struct{ I int }
var y Foo
Run Code Online (Sandbox Code Playgroud)

这些变量中的每一个都被认为具有不同的类型,即使每个变量的基础类型相同(包含名为的单个整数成员的结构I).

未命名类型的一个属性是使用相同的未命名类型声明的所有变量被认为具有相同的类型,而具有相同底层表示的两个命名类型是不同的.例如:

var x2 struct{ I int }
type Bar struct{ I int }
var z Bar
Run Code Online (Sandbox Code Playgroud)

在这里x,并x2具有相同的类型,而yz没有.

这些区别在语言的一些地方发挥作用:

  1. 即使基础类型相同,也禁止将一个命名类型的值分配给不同命名类型的变量.但是允许相关的命名和未命名类型之间的分配.也就是说,以下是可以的:

    x = y    // named type assigned to unnamed type
    y = x    // unnamed type assigned to named type
    
    Run Code Online (Sandbox Code Playgroud)

    但以下是一个错误:

    y = z    // assignment between different named types
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您可以为已命名的类型定义方法.因此可以添加方法,Foo但是无法将方法附加到变量x.

另请注意,可以在类型文字中使用命名类型来定义新的未命名类型.例如,[]Foo尽管使用了切片类型,但未命名Foo.如果我们想要将方法附加到此切片类型(例如,与sort包一起使用),我们必须将其命名为:

type Baz []Foo
Run Code Online (Sandbox Code Playgroud)