为了账号安全,请及时绑定邮箱和手机立即绑定

命名和未命名类型

命名和未命名类型

Go
至尊宝的传说 2021-11-15 15:22:03
问题:我最近开始阅读 Golang规范手册,并在试图理解相关部分中的命名和未命名类型时陷入困境。我来自动态语言,这让我有点头疼。该手册指出:类型确定特定于该类型值的一组值和操作。类型可以是命名的或未 命名的。命名类型由(可能限定的)类型名称指定;未命名类型使用类型文字指定,该类型文字从现有类型组成新类型。并继续:布尔、数字和字符串类型的命名实例是预先声明的。复合类型——数组、结构、指针、函数、接口、切片、映射和通道类型——可以使用类型文字构造。这里的问题是,在规范中,链接让我在页面上跳来跳去,忘记了太多概念的内容。其他资源:我已经四处寻找澄清,除了规范手册之外,资源稀缺。我能找到的唯一相关材料是:Learning Go - Types - 解释 Go 中类型系统细微差别的博客文章。这里有一个问题关于几乎同样的事情,我问。不幸的是,我在 Stack Overflow 上找不到任何与此相关的问题。(如果它们存在,我需要修改我的搜索方法!)。我问是因为理解一种新语言的类型系统是有效学习它的基本概念之一。所以,问题:有人可以提供一个简洁明了的例子来说明命名和未命名类型概念之间的区别吗?**另外,解释qualified和pre-declared的概念有利于完整性,但显然没有必要。
查看完整描述

2 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

一种简单的思考方式是命名类型是您用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 type

y = x    // unnamed type assigned to named type

但以下是一个错误:


y = z    // assignment between different named types

您可以为已命名的类型定义方法。因此,可以添加方法 to Foo,但无法将方法附加到变量x。


另请注意,命名类型可用于类型文字以定义新的未命名类型。例如,[]Foo尽管使用了Foo. 如果我们想将方法附加到这个切片类型(例如用于sort包),我们必须命名它:


type Baz []Foo


查看完整回答
反对 回复 2021-11-15
?
杨魅力

TA贡献1811条经验 获得超6个赞

对于初学者来说,语言规范就是它听起来的样子——一个参考文档。这是一个很好的工具,可用于参考,但不适用于学习语言。你最好学习关于通过围棋围棋之旅,互动介绍了语言的,或通过各方面的有效围棋,详细介绍了如何使用的语言。


未命名类型只是通过使用类型文字声明而没有名称的类型,换句话说,原始类型后跟使其在 {} 中的其他类型的列表。或者再次引用规范,类型文字“从现有类型组合一个新类型” 下面是一个带有结构的示例,但虽然未命名的结构可能很少见,但通道和映射(同样,它们自己做的很少,必须由其他类型组成)类型)很少被命名。


package main


import "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)

}


查看完整回答
反对 回复 2021-11-15
  • 2 回答
  • 0 关注
  • 271 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信