别名和类型再定义

Golang 语言中,我们可以用关键字type声明自定义的各种类型。在使用type时,声明的自定义类型有不同的区别。




别名类型

1
type MyString = string

这条语句表示,MyString是string类型的别名类型。别名类型与其源类型的区别只是在名称上,它们是完全相同的。源类型与别名类型是一对概念,是两个对立的称呼。别名类型主要是为了代码重构而存在的。详细的信息可参见 Go 语言官方的文档Proposal: Type Aliases

Go 语言内建的基本类型中就存在两个别名类型。byteuint8的别名类型,而runeint32的别名类型。

类型再定义

1
type MyString2 string // 没有等号

这条语句表示,string类型再定义成了另外一个类型MyString2。这种方式也可以被叫做对类型的再定义。 string可以被称为MyString2的潜在类型。潜在类型的含义是,某个类型在本质上是哪个类型。

潜在类型相同的不同类型的值之间是可以进行类型转换的。因此,MyString2类型的值与string类型的值可以使用类型转换表达式进行互转。

但对于集合类的类型[]MyString2与[]string来说这样做却是不合法的,因为[]MyString2与[]string的潜在类型不同,分别是[]MyString2和[]string。另外,即使两个不同类型的潜在类型相同,它们的值之间也不能进行判等或比较,它们的变量之间也不能赋值。