猿问

命名和未命名类型

问题:

我最近开始阅读 Golang规范手册,并在试图理解相关部分中命名和未命名类型时陷入困境。我来自动态语言,这让我有点头疼。

该手册指出

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

并继续

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

这里的问题是,在规范中,链接让我在页面上跳来跳去,忘记了太多概念的内容。


其他资源:

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

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


所以,问题:

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

*另外,解释qualifiedpre-declared的概念有利于完整性,但显然没有必要。


至尊宝的传说
浏览 272回答 2
2回答

有只小跳蛙

一种简单的思考方式是命名类型是您用type语句定义的类型,而未命名类型是由类型文字定义的复合类型。例如,变量的类型x是未命名的:var x struct{ I int }变量的类型y命名为:type Foo struct{ I int }var y Foo这些变量中的每一个都被认为具有不同的类型,即使每个变量的基础类型是相同的(包含一个名为 的单个整数成员的结构I)。未命名类型的一个特性是使用相同的未命名类型声明的所有变量都被认为具有相同的类型,而具有相同底层表示的两个命名类型是不同的。例如:var x2 struct{ I int }type Bar struct{ I int }var z Bar这里x和x2有相同的类型,而y和z没有。这些区别在语言中的几个地方发挥作用:禁止将一种命名类型的值分配给不同命名类型的变量,即使基础类型相同。但是,允许在相关的命名和未命名类型之间进行分配。也就是说,以下是可以的:x = y    // named type assigned to unnamed typey = x    // unnamed type assigned to named type但以下是一个错误:y = z    // assignment between different named types您可以为已命名的类型定义方法。因此,可以添加方法 to Foo,但无法将方法附加到变量x。另请注意,命名类型可用于类型文字以定义新的未命名类型。例如,[]Foo尽管使用了Foo. 如果我们想将方法附加到这个切片类型(例如用于sort包),我们必须命名它:type Baz []Foo

杨魅力

对于初学者来说,语言规范就是它听起来的样子——一个参考文档。这是一个很好的工具,可用于参考,但不适用于学习语言。你最好学习关于通过围棋围棋之旅,互动介绍了语言的,或通过各方面的有效围棋,详细介绍了如何使用的语言。未命名类型只是通过使用类型文字声明而没有名称的类型,换句话说,原始类型后跟使其在 {} 中的其他类型的列表。或者再次引用规范,类型文字“从现有类型组合一个新类型” 下面是一个带有结构的示例,但虽然未命名的结构可能很少见,但通道和映射(同样,它们自己做的很少,必须由其他类型组成)类型)很少被命名。package mainimport "fmt"type Named struct {    x int    y int}func main() {    a := Named{1, 2}    fmt.Println(a)    b := struct{ x, y int }{1, 2}    fmt.Println(b)}
随时随地看视频慕课网APP

相关分类

Go
我要回答