在 Go 语言中,type 关键字常被我们用来创建新的结构体。同样的,type 也可以用来创建其它的用户自定义类型。在创建新类型时,有类型别名和类型定义两种方式,你知道它们的区别吗?

1 type 关键字

对于使用过 Go 语言的人,相信对type关键字都不陌生,它可以帮助我们定义结构体或接口:

1
2
3
4
5
6
7
type Student struct{

}

type Man interface {
Name()
}

在使用 type 定义结构体时,我们可以把它看作是基于struct{}类型定义了一个新的类型Student

其实,除了用于创建新类型,type还有创建类型别名的作用。

2 类型别名 vs 类型定义

基于一个类型创建一个别名,称之为类型别名 (alias)。

基于一个类型创建一个新类型,称之为类型定义 (definition)。

1
2
type Int1 = int // 类型别名,Int1 是 int 类型的别名
type Int2 int // 类型定义,Int2 是新类型

它们之间的区别是什么呢?

以上述定义的Int1Int2为例,我们可以用int类型的变量初始化Int1类型,因为Int1只是int类型的一个别名。

但如果我们用一个int类型的变量初始化Int2类型时,对Int2类型的初始化会报错,因为Int2是一个新的类型。

1
2
3
4
5
6
7
type Int1 = int // 类型别名,Int1 是 int 类型的别名
type Int2 int // 类型定义,Int2 是新类型

var i int = 0

var i1 Int1 = i
var i2 Int2 = i // error

不过,Int1类型和Int2类型都可以用相应类型的字面量来初始化。

1
2
3
4
5
type Int1 = int // 类型别名,Int1 是 int 类型的别名
type Int2 int // 类型定义,Int2 是新类型

var i1 Int1 = 0
var i2 Int2 = 0

相关链接