什么是类型别名?什么是潜在类型?

别名类型

在Go语言里,可以用type声明自定义的各种类型。在这些自定义的类型中,有一种被叫做别名类型

举个例子:

type MyString = string

这句代码的意思是:MyString是string类型的别名类型。顾名思义,别名类型和源类型的区别仅仅在名称不同。

别名类型主要是为了重构代码而存在的。

Go语言内建的基本类型中就存在2个别名类型。byte是uint8的别名类型。rune是int32的别名类型。

潜在类型

如果这样声明类型MyString

type MyString string //注意这里没有 = 符号

这时候,MyString和string就是2个不同的类型了。这里的MyString是一个新的类型,不同于其他任何类型。这种方式叫做对类型的自定义。string可以被称为MyString的潜在类型。潜在类型的含义是:某个类型在本质上是哪个类型或者哪个类型的集合。

潜在类型相同的不同类型的值之间是可以进行类型转换的。

别名类型在代码重构过程中的作用

  1. 名字可以取的更通俗易懂;
  2. 需要修改数据类型时,只用改定义的那一处地方;
  3. 可以很方便的添加特有方法,以实现某些接口。

对于大型的代码库来说,能够重构其整体结构是非常重要的,包括修改某些 API 所属的包。大型重构应该支持一个过渡期:从旧位置和新位置获得的 API 都应该是可用的,而且可以混合使用这些 API 的引用。Go 已经为常量、函数或变量的重构提供了可行的机制,但是并不支持类型。类型别名提供了一种机制,它可以使得 oldpkg.OldType 和 newpkg.NewType 是相同的,并且引用旧名称的代码与引用新名称的代码可以互相操作。

考虑将一个类型从一个包移动到另一个包中的情况,比如从 oldpkg.OldType 到 newpkg.NewType。可以在包 oldpkg 中指定一个新类型的别名 type OldType = newpkg.NewType,这样以前的代码都无需修改。

以上,整理自《极客时间Go语言专栏》

猜你喜欢

转载自my.oschina.net/u/3672057/blog/2978938
今日推荐