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
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)
}
- 2 回答
- 0 关注
- 271 浏览
添加回答
举报