golang 1.24引入alias types的原因
在 golang 1.24 版本引入的 alias types,为类型创建别名。
它们是什么,以及我们为什么需要它们。
1、大量的数据,大量的代码
Go是为大规模编程而设计的。大规模编程意味着处理大量数据,但也需要处理大型代码库,许多工程师需要长时间处理这些代码库。
Go将代码组织成包,通过将大型代码库拆分为更小、更易于管理的部分,通常由不同的人编写,并通过公共API连接,实现了大规模编程。在Go中,这些API由包导出的标识符组成:导出的常量、类型、变量和函数。这包括结构的导出字段和类型的方法。
2、重构的需要
随着软件项目随着时间的推移或需求的变化而发展,将代码组织成包的原始组织可能会变得不充分,需要重构。
重构可能涉及将导出的标识符及其各自的声明从旧包移动到新包。这还要求必须更新对移动声明的任何引用,以便它们引用新位置。在大型代码库中,原子地进行这样的更改可能不切实际或不可行;或者说,在一次更改中移动并更新所有客户端是不切实际的或不可行的。
3、阶段性升级
相反,更改必须逐步进行:例如,要“移动”函数F,我们可以将其声明添加到新包中,而不删除旧包中的原始声明。这样,客户端可以随着时间的推移逐步更新。一旦所有调用者都引用了新包中的F,就可以安全地删除F的原始声明(除非为了向后兼容性必须无限期保留)。
4、函数的升级
将函数F从一个包移动到另一个包,同时将其保留在原始包中很容易:只需要一个包装器函数。为了将F从pkg1移动到pkg2,pkg2声明了一个与pkg1.F具有相同签名的新函数F(包装器函数),pkg2.F调用pkg1.F。新调用者可以调用pkg2.F,旧调用者可以调用pkg1.F,但在这两种情况下,最终调用的函数是相同的。
5、常量、变量的升级
移动常数同样简单明了。变量需要更多的工作:可能必须在新包中引入指向原始变量的指针,或者可能使用访问器函数。这不太理想,但至少是可行的。这里的重点是,对于常量、变量和函数,现有的语言特性允许如上所述的增量重构。
但是移动一个类型呢?
6、类型无法升级
在Go中,(限定的)标识符,或简称为名称,决定了类型的身份:由包pkg1定义和导出的类型T不同于由包pkg2导出的T的相同类型定义。此属性使T从一个包移动到另一个包变得复杂,同时在原始包中保留其副本。例如,类型为pkg2.T的值不能分配给类型为pkg1.T的变量,因为它们的类型名称和类型标识是不同的。在增量更新阶段,客户端可能具有这两种类型的值和变量,即使程序员的意图是让它们具有相同的类型。
为了解决这个问题,Go 1.9引入了类型别名的概念。类型别名为现有类型提供新名称,而不引入具有不同标识的新类型。