惭愧,我还没想好能怎么简单且易懂地讲述「包与可见性」。
值得一提的是,每种编程语言的「包」的概念相差都比较大,本文主要针对 Go 语言。
之前我们写代码可能都是在同一个文件里写。当我们的代码越来越多的时候,我们会有许多的代码文件,甚至有很多层文件夹。大家可以狭义地把「文件夹」理解成「包」。同一个文件夹下的项目就是在同一个包内。
如果所有的函数、变量等内容全在同一个「包」内,那他们的互相调用和访问是几乎畅通无阻的。可以随便调用。
如果我们想调用其他包的函数怎么办,比如 "fmt"
和 "time"
肯定和我们自己写的程序不在一个包内,怎么调用?
你可能注意到了,很简单,就是 import "包名"
,然后再用 包名.函数名(...)
或 包名.变量名
的方法来调用。
但并不是 import
了一个包就能用这个包里所有的内容。很多时候,我们不希望自己写的所有内容都能被其他包调用到,更多时候大部分函数和变量没有必要暴露给其他包使用。这时候,就是所谓的「可见性」了。
我们可以设置函数、变量、类型等等一系列内容「包外不可见」(注意是包外不块见,同一个包内一定是全部可见的)。这样这样这里的代码被其他包引用了,也可以保证其他包无法调用某些内容。
「包外可见」又见「导出」,「包外不可见」又叫「非导出」。
那么 Go 语言是怎么设定可见性的呢?
还是很简单,开头第一个字母大写的变量名、函数名等就是包外可见。下划线和中文视为小写。