Go Package 的封装性(Encapsulation)
封装 允许我们向外部代码暴露或隐藏我们的部分代码。
从包中暴露
通过以大写字母开头的方式定义函数,我们可以使用包将代码的某些部分暴露给外部代码。
示例 1:
example.go 将 Hi() 暴露给外部代码。
example.go 程序将 Hi
暴露给那些 不属于 example 包 的代码。外部代码可以在 导入 example
包后,以 example.Hi()
的方式引用它。
main 程序包调用 example 程序包的 Hi
函数。
main 程序包 可以调用 example 程序包的 Hi
函数。因为Hi
被命名为 Hi,而不是 hi,它 以大写字母开头。
让我们尝试一下,示例 2:
现在,example.go 并没有暴露 hi 函数,而是将其「隐藏」了。
当前,main 程序包是无法调用 example 程序包的 hi 函数的。
当您尝试运行这段程序时,Go 将显示如下错误:
example_main.go:6:2
:无法引用未导出的名称 example.hi
example_main.go:6:2
:未定义:example.hi这允许我们显示或隐藏我们对包的某些实现。
示例 3:
现在,让我们尝试隐藏包的数据,但暴露包的功能。 age data 将被隐藏,但是将 Age function 暴露出来。
example_2.go 暴露出了 Age 函数,但隐藏了 age 变量。
example_main.go 可以调用 example 包的 Age 函数,但无法直接访问 example 包的 age 数据。
→ main 程序包 可以调用 example 程序包的 Age 函数,但是,由于 age 数据的名称 以小写字母 开头,因此它无法访问 example 程序包的 age 数据。
当您暴露出一些东西,以构建您软件包的公共 API 时。一定要注意那些暴露的部分。
那么,为什么我们要隐藏对数据或功能的访问?
通过隐藏一些事物,我们可以控制对自有包中功能和数据的访问,并 降低我们代码的维护成本。
当外部代码可以访问我们代码中的所有内容时,那么我们不能更改包中的某些内容,因为这将有可能杀死外部代码。
想象一下,我们在这里暴露了 age data ,而它正被其他十几个外部代码使用。当我们想要删除 age data 时,我们做不到,因为这会破坏依赖(外部代码)代码。它会是混杂和黏连的。它会扼杀我们的代码,当然,也会慢慢地扼杀我们。我们应该减少 技术债务,而不是增加它。
或者,在另一种情况下,如果我们暴露了 age data,外部代码甚至可能会改变它,超出我们的控制,所以我们的 example包 中的代码也会被破坏。一些外部代码可能会改变我们内部包中 age 数据,我们永远也不会确定它的状态。包将变得不稳定。
封装增加了我们代码的稳定性。
在 Go 软件包中,没有仅属于(可见)一个源代码文件的源码级局部变量。 软件包中的任何代码共享相同的功能和数据,无论它们暴露与否。
例如:example_2.go中的 age 也可以被 example.go 访问,因为它们位于同一包中。使用 Go 进行编程时请注意这一点。
好了,就这些了。谢谢您一直坚持阅读到这里。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: