go-book/src/project-structure/visiblity.md

24 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 可见性
既然 Go 使用包来组织代码,就必然需要涉及到可见性的问题。可见性是在使用包组织代码时,控制包中的哪些内容在包外是可以通过包名引用直接使用的,哪些是仅可以在包内使用的。
Go 语言中的可见性控制规则其实特别的简单:如果哪个内容是允许在包外直接访问的,那么这个成员的名字只需要使用大写字母开头即可。例如函数`initiate()`就是一个包私有的内容,是不可以被包外的其他代码使用的,但是变量`ResultChan`就是一个可以直接在包外面使用的。
```admonish tip
这个可见性规则不仅在包的层级中适用,在后面介绍的结构体中也同样适用。
```
## 同一个包中不同文件之间的可见性
前面一节中提到同一个目录中的所有文件都必须使用同一个包名这就意味着他一个目录下的文件都是属于一个包的那么在这些文件之间Go 是如果控制可见性的?
答案可能与你预想的一样Go 既然把一个目录里的所有文件都作为一个包的内容,那么一个文件就是可以直接访问同一目录中其他文件中定义的内容的,无论被访问的内容是大写字母开头还是小写字母开头。这样带来的一个问题就是,一个代码文件可以直接访问其他文件中定义的内容,这实际上会给代码编辑和维护带来一定的困难,但是这并不是什么致命的问题,反而 Go 提供的这种特性更加方便把可以归类到一个包的功能拆分到若干更小的文件中去,避免了大量功能挤在一个大文件中的现象。
## 不同层级的包之间内容的可见性
在了解了 Go 对于一个包中内容可见性控制策略以后,那么就自然的会提出一个疑问:如果两个包是上下级的关系,那么它们之间的可见性控制策略是什么样的?
的确对于一些其他的语言来说,这个问题是需要特别记忆的,因为,有的语言是父级包可以直接访问子级包中的全部内容,有的是子级包可以访问父级包中的全部内容。但是对于 Go 来说,规则依旧非常简单,那就是继续坚持原有的可见性控制规则。
这个道理非常简单,也非常容易解释,那就是父级包和子级包都是 **独立存在** 的包,它们只是在硬盘上的逻辑存储结构上分出了上下级的关系而已。