Go语言访问控制指南:Java开发者必读
Go语言访问控制:Java开发者入门指南
Go支持多种编程范式,包括面向对象。但如果你从Java转向Go,可能会感到些许...呃...不适应。最明显的差异之一是Go没有任何访问修饰符。你可能会疑惑:
- 我的public、protected和private关键字去哪了?
- Go提供了哪些访问控制机制?
别担心!Go的访问控制比Java更简单,根本不需要访问修饰符。
为什么Go只需要两种访问级别
Java提供四种访问级别,按限制从严格到宽松排列如下:
- private:仅同类可见
- package-private:仅同包可见
- protected:同包及(直接/间接)子类可见
- public:全局可见
现在让我们砍掉其中两个!
以包为封装单元
Go允许定义具体类型(对应Java的类),但:
封装的基本单位是包,而不是像其他语言中的类型。
(来源:《Go编程语言》Donovan & Kernighan 第6.6节)
例如:
结构体类型的字段对同一包内所有代码可见。
(同上)
因此Go不需要区分private和package-private。现在剩下三种:
- package-private:仅同包可见
- protected:同包及子类可见
- public:全局可见
没有继承机制
Go不提供继承机制,因此不需要区分package-private和protected。最终只剩下两种:
- package-private:仅同包可见
- public:全局可见
Go的访问控制实现
Go采用术语导出(exported)和非导出(non-exported):
- 标识符满足以下条件即为导出:
- 首字母是大写Unicode字符(Lu类)
- 声明在包块中,或是字段/方法名
- 其他均为非导出
示例:
package foo
var (
Bar = "Bar" // 导出
baz = "baz" // 非导出
)
结论
Go的设计注重可读性,其访问控制决策显著提升了代码清晰度:不仅省去了繁琐的修饰符,通过首字母大小写即可判断可见性。这正是阅读Go代码比Java更轻松的原因之一——当然,这只是我的个人观点。你怎么看?
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码