Go Package 的封装性(Encapsulation)

Go

封装 允许我们向外部代码暴露或隐藏我们的部分代码。

从包中暴露

通过以大写字母开头的方式定义函数,我们可以使用包将代码的某些部分暴露给外部代码。

示例 1:

Go

example.go 将 Hi() 暴露给外部代码。

example.go 程序将 Hi 暴露给那些 不属于 example 包 的代码。外部代码可以在 导入 example 包后,以 example.Hi() 的方式引用它。

Go

main 程序包调用 example 程序包的 Hi 函数。

main 程序包 可以调用 example 程序包的 Hi 函数。因为Hi 被命名为 Hi,而不是 hi,它 以大写字母开头

让我们尝试一下,示例 2:

Go

现在,example.go 并没有暴露 hi 函数,而是将其「隐藏」了。

Go

当前,main 程序包是无法调用 example 程序包的 hi 函数的。

当您尝试运行这段程序时,Go 将显示如下错误:

example_main.go:6:2:无法引用未导出的名称 example.hi
example_main.go:6:2:未定义:example.hi

这允许我们显示或隐藏我们对包的某些实现。

示例 3:

现在,让我们尝试隐藏包的数据,但暴露包的功能。 age data 将被隐藏,但是将 Age function 暴露出来。

Go

example_2.go 暴露出了 Age 函数,但隐藏了 age 变量。

Go

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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://blog.learngoprogramming.com/pack...

译文地址:https://learnku.com/go/t/47091

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!